阻塞socket的recv,有没有办法退出循环
服务端:
- C/C++ code
fcmd = popen("./test","r"); if(fcmd == 0) { bail("popen() failed"); close(detect_sock); return false; } memset(databuf, 0, PIPE_BUF - 1); int bytes = 0; while((bytes = read(fileno(fcmd), databuf, PIPE_BUF)) > 0) { replace(databuf, "\n", "\r\n", PIPE_BUF-1); write(detect_sock, databuf, strlen(databuf)); memset(databuf, 0, PIPE_BUF - 1); } memset(databuf, 0, PIPE_BUF - 1); if(pclose(fcmd) != 0) { printf("Non-zero return value from DIY command,error no is %d\r\n",errno); } close(detect_sock);客户端:
- C/C++ code
while ((bytes = recv(detect_sock, databuf, sizeof(databuf),0) > 0)) { memset(databuf,0,sizeof(databuf)); bytesread += bytes; } closesocket(detect_sock);现在发现服务端运行完了close(detect_sock);但是客户端还是是阻塞在recv这个函数中,有没有办法,当服务端关闭了端口之后,客户端退出循环????
[解决办法]
先peek一下,有数据才recv
[解决办法]
肿么会呢,客户端应该读到EOF的,就是recv返回值为0.
[解决办法]
用异步事件通知的
wsaayaselect:
如果服务段关闭,客户端会收到通知。
客户端收到通知以后,就可以退出循环了