2015-12-08 31 views
-1

我有一个客户端/服务器程序。客户端运行良好。但是,当客户端得到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

错误10060指示尝试连接到服务器失败,例如,由于网络出现故障或因为它被防火墙阻止。服务器无法知道客户端正在尝试连接,因此accept()仍在等待连接。 –

+0

'accept'在有连接时返回,并且您的客户端没有连接(因为导致它无法连接的某些错误)。你期望发生什么? – immibis

+0

@HarryJohnston在这种情况下,我需要一个处理这种情况的机制。例如,10分钟后服务器将停止接受,返回一个值并做其他事情。 –

回答

5

accept呼叫不能回报你一个值到达。如果你什么都不做,客户端也不会出现,accept不会永远返回。

你所需要的就是

  1. 使用select之前accept,看是否有可用的待处理的客户。

  • 使用setsockopt设置SO_SNDTIMEO和/或SO_RCVTIMEO的选项,使accept退出后的一段时间,甚至立即。
  • 实施细节可以在这里找到:How to accept socket with timeoutSetting Socket Timeout?

    +0

    我在accept()之前使用select()。它工作完美!谢谢! –