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

标签 c++ c

希望有人能帮帮我。如果我的套接字无法在一定时间内接收数据,我想实现某种超时...我已经在网上查找了方法,但我看过的示例没有 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/

相关文章:

C++比较函数结果

android - JNI : properly manage lifetime of a Java object

java - c++ 套接字客户端继续从 Java 服务器接收某些内容,即使输出流已关闭

c - 当我编译 int main 时到底发生了什么;在 C

c - 如何使用队列

c - 将文件中的某些信息存储到数据结构中

c++ - std::enable_shared_from_this::shared_from_this 如何工作

python - 打破 SWIG Python 接口(interface)——容器创建命名空间冲突

c - 如何正确设置 ALSA 设备

C多线程死锁的线程事件