2012-04-18 50 views
8

我的應用程序創建一個TCP連接,這是正常工作。 但在一個網絡服務器有很多IP說TCP連接錯誤115正在進行操作原因是什麼?

  • 174.XXX
  • 54.xxx 這樣

當調用TCP連接(非60秒超時阻塞) 到IP 174.X.X.X總是成功。 但是TCP連接到ip 54.x.x.x的同一臺服務器正在失敗(大部分時間),正在進行測量操作。

能否請您給我解釋一下什麼是錯誤號115

OS可能的原因是:Linux的

我的TCP conenct代碼如下

tcp_connect(......) 
{ 

    int iValOpt = 0; 
    int iLength= 0; 

    fcnt((int)(long)SockID,F_SETFL_O_NONBLOCK); 

    ret = connect (sockID,(struct sockaddr*)pstSockAdr,uiSockLen); 

    if (ret < 0) 
    { 

     if (errno == EINPROGRESS) 
     { 
       stTv.tv_sec = 60; 
       stTv.tv_usec = 0; 
       FD_ZERO(&write_fd); 
       FD_SET(sockID,&write_fd); 

       iLength = sizeof(int); 

       if (0 < select (sockID+1) , NULL,&write_fd,NULL,&stTv); 

       { 
         if(0 > getsockopt(sockID,SOL_SOCKET,SO_ERROR,(void*)(&iValOpt),&iLength)) 
         { 
           return -1 
         } 

         if (0 != iValOpt) 
         { 
           return -1; 
         } 


         return success; 
       } 

       else 
       { 
         return -1; 
       } 

     } 
     else 
     { 
       return -1; 
     } 
    } 

    return success; 

} 
+0

如果你試圖telnet到54.x.x.x IP不使用你的應用程序會發生什麼?同樣的行爲? – 2012-04-18 06:46:10

+0

否,手動膩子應用工作正常 – user1340512 2012-04-18 08:12:09

+1

'無阻塞超時'是一個矛盾的術語。 – EJP 2012-04-18 21:44:00

回答

4

這似乎是connect()行爲:

如果連接不能立即建立,並且O_NO NBLOCK爲套接字的文件描述符設置爲 ,connect()將失敗,並且 將errno設置爲[EINPROGRESS],但連接請求不會被中止,並且連接將異步建立。 在 連接建立之前,連接()的相同套接字的連接調用將失敗並將errno設置爲[EALREADY]。

+0

我的應用程序是SFTP,用戶創建多個連接到同一端口的服務器22 – user1340512 2012-04-18 08:13:56

14

根據您的信息:

  • 你正在嘗試做一個connect()54.x.x.x
  • 這個插座non-blocking
  • 連接超時時間爲60 sec

首先,如果你看看你的/usr/include/asm-generic/errno.h你會看到以下內容:

#define EINPROGRESS  115  /* Operation now in progress */ 

這意味着套接字上的現有操作正在進行中。因爲,你說你正在做一個connect()電話,讓做一個man connect

 
EINPROGRESS 

The socket is nonblocking and the connection cannot be completed 
immediately. It is possible to select(2) or poll(2) for completion by 
selecting the socket for writing. After select(2) indicates 
writability, use getsockopt(2) to read the SO_ERROR option at level 
SOL_SOCKET to determine whether connect() completed successfully 
(SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual 
error codes listed here, explaining the reason for the failure). 

所以,最好的猜測是對TCP的三次握手(你connect()調用54.x.x.x IP地址)正在長於預計將完成。由於connect()操作已在進行中,因此套接字上的任何後續操作都會導致EINPROGRESS錯誤代碼。如手冊頁中所建議的,嘗試使用select()poll()來檢查您的套接字是否可以使用(執行read()write()調用)。

您可以通過捕獲和分析自己機器和/或從您自己的機器上的流量來完成阻止您的TCP握手完成的任務,並且54.x.x.x。幫助你做到這一點的最佳工具叫做WireShark。祝你好運。

TCP 3 way handshake

+0

我已經添加了我的代碼上面,請你檢查是否有任何可能的錯誤?上面的代碼在我的網絡中工作正常,可能是因爲我的網絡非阻塞錯誤EINPROGRESS從未發生 – user1340512 2012-04-18 17:52:17

+0

@ user1340512:嘗試發佈乾淨完整的代碼版本,以便測試。 – gsbabil 2012-04-19 00:52:08

+0

謝謝你的回覆,我不能在這裏發佈所有的代碼,但是我只粘貼了失敗返回的代碼。代碼在我們的網絡中工作得很好(可能是因爲在我們的網絡中,不會發生阻塞錯誤並始終保持成功)。我需要知道的是,如果EINPROGRESS errno設置高於代碼工作正常或在60 s之前abvoe代碼可以返回-1 – user1340512 2012-04-19 07:22:47