我有一个客户端/服务器程序。客户运行良好。但是当客户端收到10060错误时,服务器似乎停留在accept()并且无法获得返回值。我怎样才能解决这个问题?我需要accept()来返回错误,以便服务器可以继续做其他事情。
客户代码:
SOCKET sock, sendrecv;
sendrecv = myInitClientSocket(szIP, 6666);
if ( sendrecv ==0 ){ //socket 10060 error so that myInitClientSocket returns 0
int err= WSAGetLastError();
shutdown(sendrecv, 0x02);
closesocket(sendrecv);
return 0;
}
服务器代码:
SOCKET sock, sendrecv;
struct sockaddr_in sock_addr,sendrecv_addr;
WSADATA data;
WORD p;
p=MAKEWORD(2,2);
int resStartup = WSAStartup(p,&data);
sock = WSASocket (AF_INET, SOCK_STREAM, 0, 0, 0, 0);
int nREUSEADDR = 1;
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(const char*)&nREUSEADDR,sizeof(int));
sock_addr.sin_family=PF_INET;
sock_addr.sin_port=htons(6666);
sock_addr.sin_addr.s_addr=INADDR_ANY;
int resBind = bind(sock,(struct sockaddr*)&sock_addr,sizeof(struct sockaddr_in));
int resListen =listen(sock, 5);
int lun = sizeof (struct sockaddr);
sendrecv = accept(sock,(struct sockaddr*)&sendrecv_addr,&lun); //stucking here
if(sendrecv == INVALID_SOCKET )
{
//can't go in here
return 5 ;
}
答案 0 :(得分:5)
accept
调用无法返回值,因为此调用应该阻止进程的执行并等待客户端到达。如果您什么都不做而且客户没有出现,accept
将永远不会回来。
这里需要的是
select
之前使用accept
查看是否有待处理的客户端。或
setsockopt
设置SO_SNDTIMEO
和/或SO_RCVTIMEO
选项,以便在一段时间后立即退出accept
。可在此处找到实施详情:How to accept socket with timeout和Setting Socket Timeout?