在c中选择显示奇怪的行为

时间:2013-06-20 09:23:28

标签: c sockets select tcp

我编写了一些代码,应该遍历一个套接字列表,向它们发送数据包,如果有答案,则将其发送回特定的套接字。

以下是我的代码片段:

   
 while ((curr_fd = conn_get_node()) > 0) {

   send(curr_fd, fifo_packet.packet, MSGLENGTH, 0);

   FD_ZERO(&rfds);
   FD_SET(curr_fd, &rfds);

   got_answer = select(curr_fd + 1, &rfds, NULL, NULL,
                   &tv);

   if (got_answer == -1) {
           perror("select()\n");
   } else if (got_answer == 1) {
           get_packet(curr_fd, &answer);
           send(fifo_packet.from_fd, &answer, MSGLENGTH, 0);


   } else {
           printf("no data within 100us\n");
           continue;
}

现在它显示,对于发送的前两个或三个数据包,select总是说,它没有收到任何东西(got_answer = 0),虽然我可以看到数据已经通过嗅探器到达。大约第三个数据包后,它开始工作(got_answer = 1)。

有人知道我做错了吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您没有检查select()何时返回fd仍处于“准备阅读”设置。使用FD_ISSET()进行检查。这是必需的,因为select()可以返回,原因不是数据可用。