私は次のサンプルコードを読んで、connect()
がEINPROGRESSまたはEALREADY以外のもので失敗する可能性があるプラットフォームが誰かが言うことができるかどうか疑問に思っています。O_NONBLOCKソケットのconnect()がEINPROGRESSまたはEALREADY以外のものと失敗することはありますか?
失敗すると、実行するサンプルのelse
ブランチを実行することを意味します。ソースのコメントはFreeBSDを示唆しています。他のシステムはありますか?私はそれをLinuxで失敗させることができませんでした。
if (connect(hostp->sockets[i],
(struct sockaddr *)res->ai_addr,
res->ai_addrlen) == -1) {
/* This is what we expect. */
if (errno == EINPROGRESS) {
printf(" connect EINPROGRESS OK "
"(expected)\n");
FD_SET(hostp->sockets[i], &wrfds);
} else {
/*
* This may happen right here, on
* localhost for example (immediate
* connection refused).
* I can see that happen on FreeBSD
* but not on Solaris, for example.
*/
printf(" connect: %s\n",
strerror(errno));
++n;
}
[...]
ソース:http://mff.devnull.cz/pvu/src/tcp/non-blocking-connect.c
インターフェイスがダウンしていると期待しています。私はこれを次に試みます。 (私は、これらの失敗を正しく処理しないと思うコードを扱っています。実際の再生手順を書き留めて、ファイル記述子がリークするようにしたいと思います。 – user7610
私はそれを失敗させる(またはそのことに関しては成功する)ことができませんでした。私はlinux、freebsd、openindiana(半心)を試みました。それでも、コード内の可能性を扱うことは間違いなくバグです。 – user7610