15

私のアプリケーションはTCP接続を作成します。これは正常に機能しています。しかし、1つのネットワークサーバーには多くのIPがあります

  • 174.XXX
  • このような54.xxx

TCP接続(60秒のタイムアウトで非ブロッキング)をIPに呼び出すと、174.X.X.X 常に成功します。しかし、IPを使用した同じサーバーへのTCP接続54.x.x.x は(ほとんどの場合)失敗し、errno115measn操作が進行中です。

errno115の考えられる理由を教えてください

OS:Linux

私のTCP接続コードは次のとおりです

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;

}
4

2 に答える 2

24

あなたの情報に基づいて:

  • あなたは~をしようとしてい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

ソケットはノンブロッキングであり、接続を完了できません
すぐに。によって完了するために、select(2) または poll(2) が可能です。
書き込み用のソケットを選択します。select(2) が示した後
書き込み可能性、レベルで SO_ERROR オプションを読み取るために getsockopt(2) を使用
connect() が正常に完了したかどうかを判断するための SOL_SOCKET
(SO_ERROR はゼロ) または失敗 (SO_ERROR は通常のいずれか)
失敗の理由を説明するエラー コードをここにリストします)。

connect()そのため、TCP 3 ウェイ ハンドシェイク (IP アドレスへの呼び出し54.x.x.x) が完了するまでに予想以上に時間がかかっていると推測できます。connect()操作は既に進行中であるため、ソケットに対する後続の操作はすべてエラー コードになりますEINPROGRESS。マニュアルページで提案されているように、ソケットを使用する準備ができているかどうselect()かを確認してください (実行または呼び出し)。poll()read()write()

自分のマシンと54.x.x.x. これを支援する最適なツールはWireSharkと呼ばれます。幸運を。

TCP 3 ウェイ ハンドシェイク

于 2012-04-18T07:23:54.193 に答える
10

これはconnect()の動作のようです:

接続をすぐに確立できず、ソケットのファイル記述子に O_NONBLOCK が設定されている場合、connect() は失敗し、errno を [EINPROGRESS] に設定しますが、接続要求は中止されず、接続は非同期的に確立されます。接続が確立される前に、同じソケットに対する connect() への後続の呼び出しは失敗し、errno を [EALREADY] に設定します。

于 2012-04-18T06:48:17.453 に答える