读书人

阻塞socket的recv有没有办法退出循环

发布时间: 2012-05-21 18:04:41 作者: rapoo

阻塞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:

如果服务段关闭,客户端会收到通知。


客户端收到通知以后,就可以退出循环了

读书人网 >C++

热点推荐