我阅读了以下示例代码,我想知道是否有人可以说明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;
}
[...]
答案 0 :(得分:3)
连接失败的方法有很多种。正如评论所说,如果没有监听服务器,即使非连接连接在某些平台上也可能在连接到localhost时立即失败。如果无法确定目标路由,则连接通常也会立即失败,例如,如果默认路由的接口已关闭。然后还有其他失败方法,例如内存不足,在沙箱内运行时拒绝连接的权限或类似内容。