• ベストアンサー

Winsockで接続待ちタイムアウトを設定する方法

現在、WinsockAPIを使ってソケット通信プログラムを作っています。  このプログラムの仕様の中で、接続待ちタイムアウトというものがあります。これはつまり、connect関数を実行してから応答が返ってくる(関数が値を返す)までの時間監視のことなのですが、そのような値をソケットに対して設定する手段というのはあるのでしょうか?

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

  • ベストアンサー
回答No.3

あるとすれば、 setsockopt() で設定できるソケットオプションのどれかということになります。 明確に書かれているものはありませんが、もしかすると、送信タイムアウトの設定で効いてくるかも知れません。 なければ、 (1)ソケットをノンブロッキングにして、 (2)connect()の完了を、タイマを掛けることのできるselect()で待ち、 (3)自分のタイムアウトが先にやってきたら、ソケットを捨てて、タイムアウト処理をする。 connect()の結果がタイムアウトで完了してもなお自分のタイマに残りがあれば、残り時間分のタイマを掛けて(2)に戻る。 というような実装になるように思います。 回答になっておりませんが、参考まで。

__haruyama
質問者

お礼

setsockopt()のヘルプを見てみましたが、タイムアウトの設定はできないみたいですね。やはり設定したタイムアウトになるまでconnect()を呼びつづけるしかないようですね。 ありがとうございます。参考にさせていただきます。

その他の回答 (2)

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.2

前に調べたときに「connect()のTIMEOUT時間は変更できない」という結果になりました。 WinSock1.1とWinSock2.0です。 WinSock2.2では調べてません。 MSDNでは If the error code returned indicates the connection attempt failed (that is, WSAECONNREFUSED, WSAENETUNREACH, WSAETIMEDOUT) the application can call connect again for the same socket. となってます。 「TIMEOUT時間を長く取りたいならconnect()をループさせろ」ってことらしいですね。 いっそ非同期の方が楽かも?

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.1

こんにちは Windows3.1の頃はwinsock.dllと同じディレクトリにあるwinsock.iniファイルに定義するものだと思うのですが、今はどうしているのか解りません。

関連するQ&A

  • Perlのソケット接続のタイムアウト

    Perlのソケット接続、connectで接続に失敗した時にdieではなく、別の接続先に接続するよう、次のように書きました。 connect(ファイルハンドル, 接続先1) || connect(ファイルハンドル, 接続先2) || die; 上記のコードではundefが帰って来た時にしか次の接続先に接続せず、例えばサーバーが応答せず、パケットをドロップしているような場合だと接続先1への接続でプログラムがハングアップしたような状態になります。 それぞれのconnectにタイムアウト時間を設けたいのですが、どのようにしたらよろしいのでしょうか。 また、ソケット接続にタイムアウトを設定できるモジュールがありましたらそちらを利用したいと思います。 Perl初心者で大変恐縮ですが、何卒宜しくお願い致します。

    • ベストアンサー
    • Perl
  • Socketの接続のタイムアウトを設定するには

    JavaでSocket通信をしようとおもっています。 Socketはnewするときにconnectもしてしまいまうらしいので 妙なIPアドレスを指定したりして、応答がもどってこないと すべてそこで止まってしまうとおもうのですが、 Timeoutをかける方法はないのでしょうか。 setSoTimeoutというメソッドはreadのときとかStreamに関してしか かけられないということが分かりました。 Socketのコンストラクタの引数にSocketImplを指定して、 Socket.setSoTimeoutしてから SocketImpl.connectすれば大丈夫かな、とおもっていたのですが、 setSoTimeoutはreadにしか効かない、と明記してあったので、無駄ですよね。 どこかに情報がないかと検索エンジンでも探してみたのですが、 見つかりません。もしかしてタイムアウトを設定するのは 一般的な方法ではないのかとも思えてきました。 ずーーーーっと接続にしにいくのを待ちつづけるしかないのでしょうか。 どのような設計(というか使うクラス?)をするべきなのか、 思い当たるかたがいらっしゃいましたら教えていただけないでしょうか。 よろしくお願い致します(__)

  • IISのタイムアウト設定について

    Windows2000+IIS6.0+ActivePerlで、時間がかかる処理を行うプログラムを作成しているのですが、 CGIタイムアウトが発生してしまい、最後まで実行 出来ません。 IISの設定で、ASPのタイムアウトや、セッションタイムアウトを30分とかに設定してもなぜか5分ほどでエラーになってしまいます。 どのようにすればCGIの実行時間を延ばせるのでしょうか?

  • Winsockのsendto関数のタイムアウトについて

    はじめまして。。。 Winsockのsendto関数を使用してユニキャストでUDP送信 しているのですが、LAN切断時等送信先がない場合、 3秒くらいsendto関数の応答が帰ってこなくて困っています。 setsockoptの「SO_SNDTIMEO」で送信タイムアウトを 設定してみたのですが、状況は変わりませんでした。 もし、LAN切断時でもすぐに応答が帰ってくる方法が ございましたらご教示頂けないでしょうか? 環境 OS:Windows XP 言語:.NET 2003 C++

  • winsockを使った通信での同時接続について

    WSAAsyncSelectを使ってソケットにくるネットワークイベントを受け取って処理しようとしています。 サーバーに複数のクライアントが接続してくる通信プログラムを作っています。 クライアントがバラバラのタイミングで接続してくると問題なく通信が行えるのですが 同時に接続してくると通信がうまく行えなくなってしまいます。 サーバー側で接続してくるクライアント分だけソケット作る必要がありますか? lまた、listen関数を使って無いのですが使う必要はありますか?

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

    OS :WinXP SP3 言語:VC++ 2005 Winsock2の通信モジュールを開発中です。 connectのタイムアウト方法をネットで調べて下記の関数を 作成(完全引用)したのですが、上手くいきません。 WSAWaitForMultipleEventsでイベントが発生していない (接続先が存在しない)のですが処理が返ってきてしまいます。 何か間違っているのでしょうか?ご回答、宜しくお願い致します。 ----------------------------------------------------------------BOOL connect2 ( SOCKET aSock, char* dwAddr, int wPort, int nTimeout ) { int liRet, liErr, liRetflag = FALSE; unsigned long lulAddr = inet_addr ( dwAddr ); WSAEVENT hEvent; DWORD dwRet; WSANETWORKEVENTS Events; sockaddr_in Addr; // イベント作成 hEvent = WSACreateEvent(); if ( hEvent == WSA_INVALID_EVENT ) { return FALSE; } // イベント型に(自動的にノンブロッキングになる) liRet = WSAEventSelect( aSock, hEvent, FD_CONNECT ); if( liRet == SOCKET_ERROR ) { WSACloseEvent( hEvent ); return FALSE; } // 接続 ZeroMemory( &Addr, sizeof( Addr ) ); Addr.sin_family = AF_INET; Addr.sin_port = htons( ( unsigned short )wPort ); Addr.sin_addr.s_addr = lulAddr; if ( connect( aSock, ( struct sockaddr* )&Addr, sizeof( Addr ) ) == SOCKET_ERROR ) { liErr = WSAGetLastError(); // WSAEWOULDBLOCKの時はまだ接続されていないので続ける if ( liErr != WSAEWOULDBLOCK ) { goto END; } } *** ↓ここですぐ返ってきてしまい、WSA_WAIT_TIMEOUTにならない *** // イベント発生待機 dwRet = WSAWaitForMultipleEvents( 1, &hEvent, FALSE, 60000, FALSE ); // dwRetがWSA_WAIT_EVENT_0以外でエラー // dwRetがWSA_WAIT_TIMEOUTの時タイムアウト if ( dwRet != WSA_WAIT_EVENT_0 ) { goto END; } // どのイベントが発生したか liRet = WSAEnumNetworkEvents( aSock, hEvent, &Events ); if( liRet == SOCKET_ERROR ) goto END; // Events.iliErrorCode[FD_CONNECT_BIT]が0の場合成功 if( ( Events.lNetworkEvents & FD_CONNECT ) && Events.iErrorCode[FD_CONNECT_BIT] == 0 ) { liRetflag = TRUE; } END: // イベント型を終了 WSAEventSelect( aSock, NULL, 0 ); WSACloseEvent( hEvent ); // ブロッキングに戻す(必要なら) dwRet = 0; ioctlsocket( aSock, FIONBIO, &dwRet ); return liRetflag; } ----------------------------------------------------------------

  • TCPのタイムアウトについて

    初歩的な質問で申し訳ありませんが、一般のTCP/IPの通信を行っている際の、 TCPのタイムアウト値って、どのくらいの時間なんでしょうか? 色々調べたのですが、結局いい答えが検索できず、接続の特性に合わせて 動的に調整されると言う回答がでました。 一般的な値でいいのですが、どなたか教えて下さい。 また、HTTPで通信を行う場合、TCPとは別にHTTPは、APレベルのタイムアウト値を 持っているのですよね? それは、TCPのタイムアウト値より、長いのですか?又は、短い時間となりますか? 以上よろしくお願いします。

  • タイムアウト

    SQLServer2008Exを使用してます。 MSSMSでクエリ(SELECT文)を実行するとタイムアウトになってしまします。 データの量はそれなりにあるのですが、実行タイムアウトは0(ゼロ)無限の待ち時間に設定してあるのに何故なんでしょうか?

  • URLConnectionを用いたHTTPS通信時のタイムアウト設定

    現在java1.4.2.10を用いて、 指定のIDに紐づいたURLをDBから取得し、URLConnectionを用いて、取得したURL接続するといったプログラムを作成しております。 今回困っておりますのが、取得したURLがHTTPS通信だった場合のタイムアウト設定方法となります。 HTTPの場合は、下記のサイト http://www.slayers.nu/~kumasaka/Gyoumu/timeout.html を参考にさせていただき、なんとかなりましたが、HTTPSの場合には対応しておらず、困っております。 java1.5にはタイムアウト設定があるのですが、都合上1.5にはできず、 1.4.2で対応したく考えております。 System.setProperty に sun.net.client.defaultReadTimeout を設定することで getInputStream から抜けるまでの時間を制御できるようなのですが、これだと、1接続ごとにタイムアウト設定できません。 socket通信も考えたのですが、socket通信を用いた場合の、HTTPS通信の仕方もわからず、どなたかご教授のほどよろしくお願いいたします。

  • ソケットプログラミングについて_WinSock2

    コネクションの確立はlisten関数、accept関数、connect関数を用いて行い、パケット送信の場合は、UDPで送信するというプログラムを作成したいと思っています。 この場合、listen関数、accept関数、connect関数を使用する際は、TCPソケットをオープンするという形になるのでしょうか? それとも、listen,accept,connect関数は、UDPソケットオープンでよいのでしょうか? よろしくお願いします。

専門家に質問してみよう