0

読み取るデータがあるかどうかを確認するために、UDP ソケットで select() を呼び出しています。メソッドが -1 を返し、errno が 22 (無効な引数) に設定されるたびに。ここに私のコードの一部があります:

fd_set sockets;
struct timeval alarm;
alarm.tv_sec = 0;
alarm.tv_usec = 1000;
FD_ZERO(&sockets);
FD_SET(udpSocket, &sockets);
maxfd = udpsocket + 1;
selected = select(maxfd, &sockets, NULL, NULL, &alarm);
printf("%d\n", selected);

「選択済み」は常に -1 です。この時点ですでにデータを正常に送信しているため、ソケットが正常であることはわかっています。

4

2 に答える 2

2

selectのマニュアルページによると、 「nfdsが負であるか、タイムアウトに含まれる値が無効です」という意味であり、それ以下であるEINVALことを示唆しています。udpsocket-2

考えられるヒントの 1 つ: udpSocketfd_set に設定してから、を使用udpsocketして計算しますmaxfd。1 つの文字の場合のみ異なる 2 つの変数があると、見落としがちです。

于 2012-06-07T16:29:38.637 に答える
2

エラーの理由は、アラームのマイクロ秒プロパティを次のように設定していたためであることが判明しました。

alarm.tv_usec = 2000000;

これは明らかに高すぎる値です。明らかに、seconds プロパティを 2 に設定する方が簡単でした:

alarm.tv_sec = 2;
于 2012-06-07T18:03:57.353 に答える