套接字accept()后无法获取返回值

标签 c windows sockets

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

最佳答案

accept 调用无法返回值,因为此调用应该阻止进程的执行并等待客户端到达。如果您什么都不做并且客户端没有出现,accept 将永远不会返回。

这里你需要的是

  1. 接受之前使用选择来查看是否有可用的待处理客户端。

  • 使用setsockopt设置SO_SNDTIMEO和/或SO_RCVTIMEO选项以使accept在一段时间后退出或甚至立即。
  • 可以在此处找到实现详细信息:How to accept socket with timeoutSetting Socket Timeout?

    关于套接字accept()后无法获取返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34147424/

    相关文章:

    c - 多维数组的形式参数

    c - HashTable插入和查找的指针问题

    c++ - 在 C++ 中将 UnicodeString 转换为 const char* 最简单的方法?

    c - 如何通过套接字发送结构?

    c++ - 比较套接字地址的问题

    php - 如何找出接收到的udp数据包的数据大小

    c - 关于使用低级函数

    c - 在控制台应用程序中读/写特殊字符(如波形符、ñ、...) C

    windows - 如何在包含引号 ( "") 的批处理文件中运行命令?

    python - 如何使用python运行带有参数的exe文件