如何检测我是否有从插座中读取的东西? (C ++)

时间:2017-01-09 19:38:55

标签: c++ sockets

我试图在一定数量的s中回复客户的回答。我怎么能这样做?我的意思是我有那个代码

 unsigned secondsElapsed = 0;
    while(secondsElapsed <= TIMER){
        char tBuffer[32];

    if (recv(clientSocket, tBuffer, sizeof(tBuffer), MSG_PEEK | MSG_DONTWAIT) == 0){
            myPlayer->dcPlayer();
            \\ More stuff to do if player is dissconected
    \\ But if is not dc, and is typing, how can i check my socket to see
    \\ if i have an answer there to read, else i`ll increment 
    \\ secondsElapsed until is equal to TIMER or until i get an answer    
    \\ from my client.

    usleep(1000000);
    secondsElapsed++;
    }

所以,问题是:我如何检查我的客户是否给我一个答案?如果我尝试阅读,那么我的程序将被卡住,我将无法增加秒数。

2 个答案:

答案 0 :(得分:4)

这里有很多选择。首先,您可以使用非阻塞套接字(通常不是那么好的解决方案)。更好的选择是使用操作系统提供的轮询/异步通知机制 - 例如,* Nix用户可以选择selectpollepoll,而Windows则可以选择{&#39;自己的异步事件通知API,例如,I / O完成端口,如下所述:https://msdn.microsoft.com/en-gb/library/windows/desktop/aa365198(v=vs.85).aspx

答案 1 :(得分:0)

您可以使用select()(或* Nix系统上的pselect()(e)poll())了解数据何时可用,然后再拨打recv()(或{{1} })阅读它,例如:

read()