2017-08-24 210 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

相關問題