お世話になっております。
現在Socket通信を行うプログラムを作成しており、
電文受信時(SocketクラスのReceiveメソッド)にタイムアウト設定を設けたいと思っています。
その場合、SocketクラスのReceiveTimeoutを使えばよいことは調べてわかったのですが、
タイムアウト設定を2秒として使用してみると、
電文受信時から2秒ではなく、電文を受信していない時間が2秒経過した場合に例外処理されてしまうように見受けられます。
電文受信時からの設定を行いたいのですが、方法はございますでしょうか?
(それとも私の何かしらの処理がおかしいのか)
また、タイムアウトで例外扱いになった場合、
再度クライアントから電文を送信すると受信処理が行われません。
その場合、ソケットがクローズされた扱いになっているのでしょうか?
再開方法も教えていただければ幸いです。
・参考サイト
http://note.chiebukuro.yahoo.co.jp/detail/n1656
// 接続待ち開始ボタンのクリックイベント private void button1_Click(object sender, EventArgs e) { if (!SLTAlive) // まだ接続待ちスレッドを生成していない場合 { // Socket の生成 ServerSocket = new System.Net.Sockets.Socket( System.Net.Sockets.AddressFamily.InterNetwork, // IP version 4 のアドレス System.Net.Sockets.SocketType.Stream, // 通信方式をバイトストリーム System.Net.Sockets.ProtocolType.Tcp); // プロトコルをTCP // ホストのIPアドレスとポート番号の指定 System.Net.IPEndPoint EndPointHost = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("127.0.0.1"), 9000); // *** System.Net.IPEndPoint EndPointHost = new System.Net.IPEndPoint(System.Net.IPAddress.Any, 9000); ServerSocket.Bind(EndPointHost); // ローカル エンドポイント(IPアドレス等の情報)と関連付け ServerSocket.Listen(100); // 電文取り出しの接続がまだ保留中におけるキューの最大長 // 接続待ち用スレッドを作成 StartListeningThread = new System.Threading.Thread(StartListening); // 接続待ち用スレッドを開始 StartListeningThread.Start(); // スレッド終了指示フラグを未終了に設定 SLTAlive = true; } } // 接続待ちスレッド用メソッド private void StartListening() { label1.Text = "サーバー開始"; try { // 受信の受付を行なうための無限ループ while (SLTAlive) // スレッド終了指示フラグでの終了指示がある場合はループ終了 { // クライアントからの接続を受け付ける System.Net.Sockets.Socket ClientSocket = ServerSocket.Accept(); // Socketクライアント //*************ここで電文受信時のタイムアウトを2秒間に設定************* ClientSocket.ReceiveTimeout = 2000; // クライアントからの電文の受信 byte[] ReceiveData = new byte[2000]; int ResSize = ClientSocket.Receive( ReceiveData, ReceiveData.Length, System.Net.Sockets.SocketFlags.None); // 受信 string str = System.Text.Encoding.Unicode.GetString(ReceiveData); textBox1.Text = str; // 受信データ // 返信電文をクライアントへ送信 byte[] SendBuffer = Encoding.Unicode.GetBytes("本サーバーの御利用ありがとう御座います。"); int i = ClientSocket.Send(SendBuffer); // Socketクライアントをクローズ ClientSocket.Shutdown(System.Net.Sockets.SocketShutdown.Both); ClientSocket.Close(); } } catch (Exception ex) { label1.Text = "サーバー終了"; } } }

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。