2011-01-17 4 views
0

コードSinnpet:select function internaly call tcp connectですか?

int CreateaTCPSocket() 
{ 
    int iSockID = ACE_OS::socket(......); 
    ACE_OS::set_flags(iSockID,O_NONBLOCK); 
    ACE_OS::bind(); 
    if (ACE_OS::connect(iSockID ,....) < 0) 
    { 
     if (ACE_OS::select(.....,timeout) <= 0) 
     { 
      return INVALID_HANDLE; 
     } 
    } 
    return iSockID; 
} 

私の質問は、非ブロック・エラーのために失敗し、選択されたときに接続され呼び出されると、我々は接続しない内部関数を接続するか、選択呼び出す必要が再度選択リターンの成功を言っていますか?

+0

コードが読み取り可能であるようにあなたの質問を再フォーマットしてください。 – ulidtko

答えて

3

ブロッキングソケットとノンブロッキングソケットの両方で、connect()を一度呼び出すだけで済みます。

ソケットが非ブロックで、connect()EINPROGRESSを返すときは、ソケットが書き込み準備ができるまで待つ必要があります。select()を使用してください。 select()がソケットの書き込み準備ができていると報告すると、connect()が成功したか失敗したかのいずれかになります。

は、非ブロッキング connect()は、あなたが失敗した場合にゼロ以外のエラーが報告さ getsockopt(..., SOL_SOCKET, SO_ERROR, ...)を呼び出す、またはのみ接続されたソケットに成功 getpeername()を呼び出すことができます成功したかどうかを確認します。

+0

返事ありがとうございます。あなたの回答は、reurn> 0を選択した場合でも、本当に接続かどうかを確認する必要がありますか? – Syedsma

+0

'select()'は 'connect()'が成功したかどうかを報告せず、結果だけが利用可能であることを報告します。チェックをスキップして、 'connect()'が成功したと仮定することができます。この場合、後で最初の 'send()'または 'recv()'でエラーを発見します。 –

0

なぜコールセレクトは接続に失敗しましたか?あなたはそれで何を達成したいですか? selectは、引数として与えられたリソース上のアクティビティを呼び出し側に通知します。最後の書き込みをして失敗した後

  • (ブロック読み出しが実際 ブロックせずに行うことができる)が利用可能
  • データ(可能書き込みこれらの活動は

    • エラー(:TCPソケット 切断は、ピア例)とすることができますバッファフル)

    私が知っているシナリオでは、ディスクリプタがまだ開かれていないか、既に閉じられているため、選択すると常にEBADFが返されます。

    HTH

    マリオ

  • +0

    ほとんどのUNIXシステムでは、TCPソケットのデフォルトのタイムアウトがあります。connectは2〜3分です。これで10秒のタイムアウトが必要になります。まずソケットをnon-blockに設定し、 – Syedsma

    関連する問題