gpt4 book ai didi

c++ - 带超时的 C/C++ recv()

转载 作者:太空宇宙 更新时间:2023-11-04 04:36:31 27 4
gpt4 key购买 nike

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

要接收的字符串不是固定长度,这就是为什么我一次接收 1,因为我不知道字符串可能有多大。如您所见,我的 recv() 将接收数据,直到它找到文本结束字符 ()。我发现带有 select() 的示例会在调用 receive 之前使用 select,但是我应该在每次 while 循环中都这样做吗?或者在我进入 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);
}

最佳答案

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

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

一些 Google 美食:fcntl()、F_SETFLO_NONBLOCK

关于c++ - 带超时的 C/C++ recv(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30134525/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com