0

ソケットのリストを反復処理し、それらにパケットを送信し、応答があった場合は特定のソケットに送り返すコードをいくつか書きました。

これが私のコードのスニペットです:

 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;
}

これで、送信された最初の 2 つまたは 3 つのパケットについて、select は常に何も受信しなかった (got_answer = 0) と言うことがわかりますが、データがスニファーで到着したことがわかります。約 3 番目のパケットの後、機能し始めます (got_answer = 1)。

誰かが私が間違っていることを知っていますか?

私はあなたの助けに感謝します。

4

1 に答える 1

2

select()fdがまだ「読み取り準備完了」セットにあることをいつ返すかをチェックしていません。FD_ISSET()これを確認するために使用します。select()データが利用可能である以外の理由で返される可能性があるため、これが必要です。

于 2013-06-20T09:25:31.073 に答える