2012-04-18 31 views
8

私のアプリケーションはTCP接続を作成します。これは正常に動作しています。 しかし、呼び出しTCPはIPに(非は60秒のタイムアウトでブロッキング) を接続すると一つのネットワーク内のサーバは、多くのIPがこの TCP接続エラー115動作中何が原因ですか?

よう

  • 174.XXX
  • 54.xxx を言っています174.X.X.Xは常に成功しています。 しかし、54.x.x.xと同じサーバーに接続しているTCPは、errno 115 measn操作の進行中に失敗しています(ほとんどの場合)。 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

、あなたのアプリケーションを使用せずに54.x.x.x IPにtelnet接続しようとした場合はどうなりますか?同じ行動ですか? –

+0

いいえ、手動パテアプリケーションは正常に動作します – user1340512

+1

「タイムアウトでノンブロッキング」という言葉は矛盾しています。 – EJP

答えて

4

以下の通りである。これはconnect()の行動のようだ:

あなたはerrnoを115

OSのために考えられる理由が何であるかを私に説明していただけます:

すぐに接続を確立できず、O_NOソケットのファイル記述子にNBLOCKが である場合、connect()は失敗し、 はerrnoを[EINPROGRESS]に設定しますが、接続要求は になりません。また、接続は非同期に確立されます。 接続が確立される前に、その後同じソケットに対してconnect()を呼び出すと失敗し、errnoを[EALREADY]に設定します。あなたの情報に基づいて

+0

私のアプリケーションはSFTPですが、ユーザーは同じサーバーに同じポートで多くの接続を行います。 – user1340512

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 3ウェイハンドシェイク(あなたconnect()コール54.x.x.xにIPアドレスが)よりも長くかかっているということでしょう完了する予定です。 connect()操作が既に進行中であるため、ソケット上のそれ以降の操作はエラーコードEINPROGRESSになります。マニュアルページに示唆されているように、read()またはwrite()の呼び出しを実行するためにソケットが使用可能かどうかを確認するには、select()またはpoll()を使用してみてください。

自分のマシンとの間のトラフィックをキャプチャして分析することで、TCPハンドシェイクが完了するのを防ぐことができます。54.x.x.x。これを手助けする最も良いツールはWireSharkです。がんばろう。

TCP 3 way handshake

+0

上記のコードを追加しました。可能性のあるエラーを確認してください。上記のコードは自分のネットワークでうまく動作し、ネットワークの非ブロックエラーが原因である可能性があります。 – user1340512

+0

@ user1340512:テストできるように、クリーンで完全なバージョンのコードを投稿してください。 – gsbabil

+0

あなたのお返事ありがとうございます、私はここにすべてのコードを投稿することはできませんが、私は失敗が返されるコードのみを貼り付けました。コードは私たちのネットワークで正常に動作します(私たちのネットワークでは非ブロックエラーが起こることはなく、常に成功するためかもしれません)。私が知る必要があるのは、EINPROGRESSのerrno setがコード作業の上にあるか、60秒前にabvoeコードが-1を返すことができるかどうかです。 – user1340512

関連する問題