C/C++ recv() with timeout

C/C++ recv() with timeout

本文关键字:with timeout recv C++      更新时间:2023-10-16

希望有人能帮助我。如果我的插座无法在一定时间内接收数据,我想实现某种超时...我在网上查找了方式,但是我查看的示例没有RECV()在像我这样的一段时间内,他们通常只会收到正在等待的整个缓冲区。也许我的效率不是很高,有人可以将我指向接收所有数据的更好方向。

要接收的字符串不是固定的长度,这就是为什么我一次接收1个,因为我不知道字符串有多大。如您所见,我的recv()将接收数据,直到找到文本字符()的结尾为止。我发现的select()示例会在呼叫接收之前使用select,但是我是否应该为每次循环的每次操作吗?或者也许在我什至输入WALE循环之前致电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);
}

您必须将套接字放入非阻滞模式,然后使用poll()。

poll()技术上也可以在常规阻塞插座上工作;但是,我的经验是,语义和种族条件上有各种细微的差异,当将Poll()与阻塞插座使用Poll()时,为了获得最佳可移植性,我一直使用非阻滞模式插座,以及Poll(),并仔细检查从recv()或read()。

返回值

一些Google Food for您:fcntl(),F_SETFLO_NONBLOCK