0
我讀了下面的示例代碼,我想知道是否有人可以說在哪個平臺上,connect()
可能會失敗,而不是EINPROGRESS或EALREADY以外的東西。何時可以連接()O_NONBLOCK套接字失敗與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