• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Winsock Connnect タイムアウト について)

Winsock Connnect タイムアウトについて

このQ&Aのポイント
  • Winsock2の通信モジュールを開発中です。connectのタイムアウト方法に関する関数の実装について質問があります。
  • 作成した関数では、WSAWaitForMultipleEventsでイベントが発生せず、処理が返ってきてしまう問題が発生しています。
  • どのような間違いがあるのか、解決方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • sho1get
  • ベストアンサー率57% (20/35)
回答No.1

これで行けるはずです。 通常のconnect関数にタイムアウト値の引数がプラスされた ConnectEx関数です。 BOOL ConnectEx(SOCKET sock, const LPSOCKADDR lpDstAddr, int nLen, DWORD dwTimeout) { WSAEVENT hEvent; WSANETWORKEVENTS wnEvent; DWORD dwRet; BOOL fRet = FALSE; int nRet, nError; // イベント作成 hEvent = WSACreateEvent(); if (hEvent == WSA_INVALID_EVENT) { return FALSE; } // ノンブロッキング化 nRet = WSAEventSelect(sock, hEvent, FD_CONNECT); if (nRet == SOCKET_ERROR) { WSACloseEvent(hEvent); return FALSE; } // 接続 nRet = connect(sock, (LPSOCKADDR)lpDstAddr, nLen); if (nRet == SOCKET_ERROR) { nError = WSAGetLastError(); if (nError != WSAEWOULDBLOCK) { goto CE_END; } } // イベント待機 dwRet = WSAWaitForMultipleEvents(1, &hEvent, FALSE, dwTimeout, FALSE); switch (dwRet) { case WSA_WAIT_TIMEOUT: // タイムアウトエラー fRet = FALSE; break; case WSA_WAIT_FAILED: // 待機エラー fRet = FALSE; break; default: nRet = WSAEnumNetworkEvents(sock, hEvent, &wnEvent); if (nRet == SOCKET_ERROR) { goto CE_END; } if ((wnEvent.lNetworkEvents & FD_CONNECT) && (wnEvent.iErrorCode[FD_CONNECT_BIT] == 0)) { // 接続成功 fRet = TRUE; } break; } CE_END: WSAEventSelect(sock, hEvent, 0); WSACloseEvent(hEvent); // ブロッキングに戻す dwRet = 0; ioctlsocket(sock, FIONBIO, &dwRet); return fRet; }

daisanaja
質問者

お礼

ご回答ありがとうございます。 上記、関数をタイムアウト60秒で呼び出しても20秒ほどでエラーが返ってきてしまいます。 60秒のタイムアウトは不可なのでしょうか?

daisanaja
質問者

補足

接続処理のタイムアウト時間を60秒ではなく20秒以下にする仕様に変更することにより解決いたしました。 ご回答頂き、ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A