发布网友 发布时间:2022-04-20 08:22
共3个回答
热心网友 时间:2023-10-15 09:55
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 ;
}
热心网友 时间:2023-10-15 09:56
这个地址是自己设置的啊,表示监听什么地址发来的连接
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端口发来的连接
热心网友 时间:2023-10-15 09:56
int
accept(int
sockfd,
struct
sockaddr
*clientaddr,
socklen_t
*addrlen);
第二个参数clientaddr是一个传出参数,accept()返回时传出客户端的地址和端口号。
获取流程:服务器调用accept()阻塞等待,处于监听端口状态,客户端调用connect()发出SYN段并阻塞等待服务器应答,服务器应答一个SYN—ACK段,客户端收到后从connect()返回,同时应答一个ACK段,服务器收到后从accept()返回。
此问答的过程中客户端会将自己的地址和端口号告诉给服务器,填充到clientaddr地址处。