永发信息网

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

答案:3  悬赏:30  手机版
解决时间 2021-11-26 05:58
  • 提问者网友:流星是天使的眼泪
  • 2021-11-25 23:21
socket编程中、accept()函数的第二个参数、如何获取?
最佳答案
  • 五星知识达人网友:天凉才是好个秋
  • 2021-11-26 00:53
accept()函数的第二个参数是请求连接的地址,所以等待连接队列中抽取的请求连接的电脑的地址。初始化为null即可。
函数原型:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数
sockfd:套接字描述符,该套接口在listen()后监听连接。
addr:(可选)指针,指向一缓冲区,其中接收为通讯层所知的连接实体的地址。Addr参数的实际格式由套接口创建时所产生的地址族确定。
addrlen:(可选)指针,输入参数,配合addr一起使用,指向存有addr地址长度的整型数。
例子:
#ifndef UNICODE
    #defineUNICODE
#endif
#include 
#include 
#include 
//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
",iResult);
        return 1 ;
    }
    SOCKETListenSocket ;
    ListenSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(ListenSocket==INVALID_SOCKET)
    {
        wprintf(L "socketfailedwitherror:%ld
",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
",WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1 ;
    }
    if(listen(ListenSocket,1)==SOCKET_ERROR)
    {
        wprintf(L"listenfailedwitherror:%ld
",WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1 ;
    }
    SOCKETAcceptSocket ;
    wprintf(L "Waitingforclienttoconnect...
");
    //Accepttheconnection.
    AcceptSocket=accept(ListenSocket,NULL,NULL);
    if(AcceptSocket==INVALID_SOCKET)
    {
        wprintf(L "acceptfailedwitherror:%ld
",WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1 ;
    }
    else 
    wprintf(L "Clientconnected.
");
    closesocket(ListenSocket);
    WSACleanup();
    return 0 ;
}
全部回答
  • 1楼网友:野味小生
  • 2021-11-26 03:35
int accept(int sockfd, struct sockaddr *clientaddr, socklen_t *addrlen);

第二个参数clientaddr是一个传出参数,accept()返回时传出客户端的地址和端口号。
获取流程:服务器调用accept()阻塞等待,处于监听端口状态,客户端调用connect()发出SYN段并阻塞等待服务器应答,服务器应答一个SYN—ACK段,客户端收到后从connect()返回,同时应答一个ACK段,服务器收到后从accept()返回。
此问答的过程中客户端会将自己的地址和端口号告诉给服务器,填充到clientaddr地址处。追问我感觉你说的比较有道理!
  • 2楼网友:渊鱼
  • 2021-11-26 02:02
这个地址是自己设置的啊,表示监听什么地址发来的连接
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端口发来的连接
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯