c - 如何在 c 套接字中使用 select 等待特定响应而不忽略其他响应?

标签 c sockets select

我有一个客户端程序,我需要在其中发送请求并定时等待相应的响应。但我应该收到所有其他响应,即使它正在等待

我的伪代码:

接收部分:

struct timeval timeout = {
     .tv_sec = 5,
     .tv_usec = 0
};

while (1) {
   ret = select(maxfd + 1, &rdfd, NULL, NULL, &timeout);
   if (ret == 0) {
       fprintf(stderr, "No response for request\n");
       return;
   }

   ret = recvfrom(.buf..);

   struct standard_msg *std_msg = buf;

   switch(std_msg->type) {
        case TYPE_1: 
            if expecting response for TYPE_1
            read and retun from here;
            else loop until timeout
        case TYPE_2:
            if expecting response for TYPE_2
            read and return from here
            else loop until timeout
        default:
            print buf
   }
}

发送部分:

while(1) {
   struct timeval timeout = {
      .tv_sec = 50,
      .tv_usec = 0
   }
   select(1, NULL, NULL, NULL, &timeout);
   send_a_packet_wait_for_ITS_response(); //which will call the recv_secion
}

发送是通过每50秒读取一次文件内容来进行的。假设发送的数据包立即得到回复,现在我将等待 50 秒发送其他数据包。在此期间,我无法读取收到的任何数据包。如果文件到达EOF,则没有任何内容可发送,现在我也无法读取任何数据包。

所以这里我需要连续监听所有数据包并监听特定数据包。是否可以为所有其他数据包运行listen代码并为特定数据包运行listen代码?我该如何解决这个问题?

我的目的是在配置的超时内获得特定请求的回复,而不丢失其他数据包。

提前致谢

最佳答案

当您从套接字读取数据时,操作系统不会对有效负载本身(即 OSI 层 5..7)进行任何解释。这意味着像这样的所有应用程序层逻辑都必须在应用程序本身中完成。这意味着即使您不需要知道每个数据包,您也需要读取它,在这种情况下,您可以将其放入某个应用程序特定的缓冲区中以供以后使用。

关于c - 如何在 c 套接字中使用 select 等待特定响应而不忽略其他响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39387120/

相关文章:

sql-server - MSSQL 2008 R2 选择特定范围内的行 - 分页 - 最好的方法是什么

c - 多个线程之一的 pthread_join

c - ZeroMQ - 模拟多个客户端到一台服务器的标准套接字

javascript - .val().trigger ('change' ) 实际上在做什么?

mysql - 我不小心永久删除了 MySQL 套接字文件 ('/tmp/mysql.sock' ),我该如何修复它?

Java - java.net 中的 TCP 三路握手?

PHP - 下拉菜单(选择)无法正常工作到 while 循环

c - Valgrind 缩进(和低于主要)

android - 为 Android 发送 RIL 请求

c - 排除编译时循环链表错误