socket编程中、accept()函数的第二个参数、如何获取?

server端怎么知道这个参数是什么?!(我知道是client端的地址,我想知道具体怎么个获取流程!求没废话)... server端怎么知道这个参数是什么?!(我知道是client端的地址,我想知道具体怎么个获取流程!求没废话) 展开
 我来答
hwd0312
2015-10-25 · TA获得超过4336个赞
知道小有建树答主
回答量:1043
采纳率:100%
帮助的人:164万
展开全部

accept()函数的第二个参数是请求连接的地址,所以等待连接队列中抽取的请求连接的电脑的地址。初始化为null即可。

函数原型:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数

sockfd:套接字描述符,该套接口在listen()后监听连接。

addr:(可选)指针,指向一缓冲区,其中接收为通讯层所知的连接实体的地址。Addr参数的实际格式由套接口创建时所产生的地址族确定。

addrlen:(可选)指针,输入参数,配合addr一起使用,指向存有addr地址长度的整型数。

例子:

#ifndef UNICODE
    #defineUNICODE
#endif
#include <winsock2.h>
#include <stdio.h>
#include <windows.h>
//NeedtolinkwithWs2_32.lib
#pragmacomment(lib,"Ws2_32.lib")
int wmain(void)
{
    WSADATAwsaData ;
    intiResult=WSAStartup(MAKEWORD(2,2),&wsaData);
    if(iResult!=NO_ERROR)
    {
        wprintf(L "WSAStartupfailedwitherror:%ld\n",iResult);
        return 1 ;
    }
    SOCKETListenSocket ;
    ListenSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(ListenSocket==INVALID_SOCKET)
    {
        wprintf(L "socketfailedwitherror:%ld\n",WSAGetLastError());
        WSACleanup();
        return 1 ;
    }
    sockaddr_inservice ;
    service.sin_family=AF_INET ;
    service.sin_addr.s_addr=inet_addr("127.0.0.1");
    service.sin_port=htons(27015);
    if(bind(ListenSocket,
    (SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)
    {
        wprintf(L"bindfailedwitherror:%ld\n",WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1 ;
    }
    if(listen(ListenSocket,1)==SOCKET_ERROR)
    {
        wprintf(L"listenfailedwitherror:%ld\n",WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1 ;
    }
    SOCKETAcceptSocket ;
    wprintf(L "Waitingforclienttoconnect...\n");
    //Accepttheconnection.
    AcceptSocket=accept(ListenSocket,NULL,NULL);
    if(AcceptSocket==INVALID_SOCKET)
    {
        wprintf(L "acceptfailedwitherror:%ld\n",WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1 ;
    }
    else 
    wprintf(L "Clientconnected.\n");
    closesocket(ListenSocket);
    WSACleanup();
    return 0 ;
}
树大没风
2013-08-09 · TA获得超过316个赞
知道小有建树答主
回答量:200
采纳率:100%
帮助的人:104万
展开全部
int accept(int sockfd, struct sockaddr *clientaddr, socklen_t *addrlen);

第二个参数clientaddr是一个传出参数,accept()返回时传出客户端的地址和端口号。
获取流程:服务器调用accept()阻塞等待,处于监听端口状态,客户端调用connect()发出SYN段并阻塞等待服务器应答,服务器应答一个SYN—ACK段,客户端收到后从connect()返回,同时应答一个ACK段,服务器收到后从accept()返回。
此问答的过程中客户端会将自己的地址和端口号告诉给服务器,填充到clientaddr地址处。
追问
我感觉你说的比较有道理!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
stray_painter
2013-08-09 · 超过21用户采纳过TA的回答
知道答主
回答量:76
采纳率:0%
帮助的人:46万
展开全部
这个地址是自己设置的啊,表示监听什么地址发来的连接
sockaddr_in sclientAddr;
sclientAddr.sin_family = AF_INET;
sclientAddr.sin_addr.s_addr = inet_addr("1.1.1.1");
sclientAddr.sin_port = htons(270);
这样表示监听1.1.1:270地址发来的连接,
如果地址设置成为any:
sclientAddr.sin_addr.s_addr = INADDR_ANY;
sclientAddr.sin_port = htons(270);
则监听所有地址上,270端口发来的连接
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式