我有一个客户端/服务器程序.客户运行良好.但是当客户端收到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 ; }
Vovanrock200.. 5
accept
call不能返回一个值,因为这个调用应该阻止进程的执行并等待客户端到达.如果您什么都不做而且客户端没有出现,accept
则不会永远返回.
你需要的是什么
使用select
之前accept
查看是否有可用的待处理客户端.
要么
使用setsockopt
设置SO_SNDTIMEO
和/或SO_RCVTIMEO
选项,使accept
退出后的一段时间,甚至立即.
实现细节可以在这里找到:如何接受带超时的套接字和设置套接字超时?
accept
call不能返回一个值,因为这个调用应该阻止进程的执行并等待客户端到达.如果您什么都不做而且客户端没有出现,accept
则不会永远返回.
你需要的是什么
使用select
之前accept
查看是否有可用的待处理客户端.
要么
使用setsockopt
设置SO_SNDTIMEO
和/或SO_RCVTIMEO
选项,使accept
退出后的一段时间,甚至立即.
实现细节可以在这里找到:如何接受带超时的套接字和设置套接字超时?