在套接字上设置超时不起作用

布洛多恩

我正在使用该setsockopt()函数来设置函数的超时时间recvfrom()由于我使用的协议,我必须首先超时 2 秒,然后是 4 秒、6 秒,直到最大。但是当我使用该功能时,它似乎有 0.01 秒的超时时间,因为它没有等待就发送了 8 个数据包。

//more variables and code here
struct timeval timeout = {2,0};

while(1){
  setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(struct timeval));
  temp2 = recvfrom(sock, &buff, sizeof(buff), 0, (struct sockaddr *)&addr_server, sizeof(addr_server));

  if(temp2 < 0){ /* Timeout excedit (exceeded)*/
      temp = sendto(sock, (struct udp_PDU*)&reg_pdu, sizeof(reg_pdu), 0, (struct sockaddr *)&addr_server, sizeof(addr_server));
      if(temp == -1){
        printf("Error sendTo \n");
        exit(-1);
      }
      packet_counter++;
      debug("Enviat paquet REGISTER_REQ");
      if(packet_counter == 8) break;
      if((interval * max) > t ) timeout.tv_sec+=interval;

  }else{ /* s'han rebut dades (they have rebooted) */
    correct = 1;
    break;
  }
}
雷克

超时(例如您正在实施的)不是延迟语句。相反,它是一种防止诸如recv()、 或recvfrom()无限期阻塞之类的调用的方法如果数据流量比设置的超时时间更早出现,那就更好了。函数接收它,程序流程继续。超时,正如你所拥有的,最多等待 2 秒才能发生某些事情。如果什么都没有发生,那么它允许该方法停止等待,并让您的程序继续执行,即它不会阻塞。在没有超时的情况下,函数类似于recv(), orrecvfrom()可以永远阻塞。

如果您想在对and 的调用之间强制间隔 2 秒(或阻止,请放置sleep(2); ( 或者如果在 Windows 上,Sleep(2000); ) 语句在循环中的某处,可能在底部。recvfrom()sendto()

while(1){
    ...
    }
    sleep(2);  //or on Windows, Sleep(2000);
}

顺便说一句,习惯性地检查任何具有返回值的函数的返回值也是一个好主意,特别是如果该函数的失败会对您的其余代码造成严重破坏。例如:

if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(struct timeval)) < 0) {
    perror("Error");
}
...

一些主题相关的旁白:

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

套接字超时不起作用

来自分类Dev

套接字超时不起作用

来自分类Dev

Java套接字超时不起作用

来自分类Dev

阻塞 TCP 套接字超时不起作用

来自分类Dev

Android在蓝牙套接字上设置超时

来自分类Dev

套接字编程不起作用

来自分类Dev

JS 设置超时不起作用?

来自分类Dev

升级到Postgres JDBC驱动程序42.2.10+时套接字超时不起作用

来自分类Dev

Unix套接字上的nginx反向代理对uvicorn不起作用

来自分类Dev

在Python套接字上连接失败时正确设置超时

来自分类Dev

套接字连接的单例类不起作用

来自分类Dev

Python套接字在主机和VM之间不起作用

来自分类Dev

套接字获取HTML响应不起作用

来自分类Dev

PHP / Java套接字通信不起作用

来自分类Dev

Python异步套接字接收不起作用

来自分类Dev

亚行套接字不起作用和守护进程

来自分类Dev

Spark Streaming套接字流示例不起作用

来自分类Dev

示例套接字应用程序不起作用

来自分类Dev

Boost套接字读取功能不起作用

来自分类Dev

在Store App中创建套接字连接不起作用

来自分类Dev

Python套接字在主机和VM之间不起作用

来自分类Dev

套接字获取HTML响应不起作用

来自分类Dev

Android套接字客户端readUTF不起作用

来自分类Dev

从线程调用时,Python 套接字 accept() 不起作用

来自分类Dev

套接字接收后的 Memcpy 不起作用

来自分类Dev

首次连接后Python UDP套接字不起作用

来自分类Dev

设置超时在jQuery序列中不起作用

来自分类Dev

Web配置中设置的超时不起作用

来自分类Dev

单击后Javascript延迟,设置超时不起作用