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