超时

时间:2015-05-08 23:58:33

标签: c++ c

希望有人可以帮助我。如果我的套接字无法在一定时间内收到数据,我想要实现某种超时...我已经在网上查找了一些方法但是我看过的例子并没有像我一样在他们的while循环中使用他们的recv(),他们通常只接收正在等待的整个缓冲区。也许我的效率并不高,有人可以指出我接收所有数据的方向更好。

要接收的字符串不是固定长度,这就是我一次收到1的原因,因为我不知道字符串有多大。正如您所看到的,我的recv()将接收数据,直到找到文本结束字符()。我发现select()的例子在调用receive之前会使用select,但是我应该在每次循环时使用select吗?或者在我进入while循环之前调用select()?

无论如何,任何帮助都表示赞赏。

string recv_data(int socket){

bool endfound = false;
char temp[1];
string recvstring ;
while(endfound == false)//receives 1 character at a time until ETX(\x03)character is found
{
    if(recv(socket,temp,sizeof(temp),0)<0)
    {
        perror("error in recv data");
    }

    if(memchr(temp,'\x03',1) != NULL) 
    {
        endfound = true;
    }

    recvstring += temp;
    temp[0] = 0;
}

return formatting(recvstring);
}

1 个答案:

答案 0 :(得分:0)

您必须将套接字置于非阻塞模式,并使用poll()。

poll()技术上也适用于常规阻塞套接字;然而,根据我的经验,当使用带有阻塞套接字的poll()时,语义和竞争条件存在各种细微差别,为了获得最佳的可移植性,我总是使用非阻塞模式套接字,以及poll()和仔细检查来自recv()或read()的返回值。

Google的一些食物:fcntl(),F_SETFLO_NONBLOCK