2017-08-24 38 views
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

回答

2

的方法有很多,为什么连接可能会失败。正如评论正确地说,即使在连接到本地主机的情况下,如果没有侦听服务器,在某些平台上,非阻塞连接也可能立即失败。如果没有路由可以被确定到目标​​,例如如果默认路由的接口关闭,连接通常也会立即失败。然后还有其他一些失败的方式,比如缺少内存,在沙箱内运行时拒绝连接权限等。

+0

接口被关闭听起来很有希望。我会接下来尝试。 (我正在处理我认为不能正确处理这些故障的代码,并且我想写下实际的再现步骤,这会使其泄漏文件描述符(如果我能以正确的方式触发故障,会发生这种情况))。 – user7610

+0

我无法立即让它失败(或成功)。我试过linux,freebsd和openindiana(半心半意)。但是,在代码中处理这种可能性绝对是一个错误。 – user7610

相关问题