2

非ブロッキングソケットでサーバーに接続しようとすると(select()をタイムアウトパラメーターで使用できるように)、iptablesによってブロックされているポートに接続すると、-j REJECTでselect()が待機することに気付きましたタイムアウトパラメータまでですが、最大3秒.. ICMPポート到達不能パケットが本当に速いかどうかは問題ではありません.

fcntl(sockfd, F_SETFL, O_NONBLOCK);
connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr));
if (select(sockfd + 1, NULL, &fdset, NULL, NULL) == 1) {...}

上記の例では、接続が localhost:1234 に行き、ポートが上記のようにブロックされている場合、select() は 3 秒までブロックします。

「接続が拒否されました」を取得するために、この 3 秒のタイムアウトが発生する理由を知っている人はいますか? どうすれば微調整できますか (0.02ms 後に ICMP ポートに到達できなくなったため)?

4

1 に答える 1

1

connect成功した場合にのみ、ソケットは「書き込み可能」になります。select失敗時にも戻りたい場合は、ソケットの「エラー/例外」状態もチェックする必要があります。つまり、セットを 3 番目のfd_set *引数としても渡しselectます。

于 2011-04-27T16:09:35.087 に答える