2016-09-29 14 views
2

私は、以下のデータ受信用コードを持つソケットを使用するクライアントを持っています。データを受信するときにソケットにReceiveTimeoutを設定する

/** Some Code Above **/ 
private static ManualResetEvent receiveDone = new ManualResetEvent(false); 
byte[] receivedBytes = new byte[65535]; 
String msg = null; 

public String ReceiveMessage() { 
    csocket.BeginReceive(receivedBytes, 0, receivedBytes.Length, SocketFlags.None, new AsyncCallback(receiveCallback), csocket); 
    receiveDone.WaitOne(); 
    return msg; 
} 

private void receiveCallback(IAsyncResult ar){ 
    try{ 
     Socket socket = (Socket)ar.AsyncState; 
     socket.ReceiveTimeout = 10000; /**** Not Working ****/ 
     int received = socket.EndReceive(ar); 
     byte[] dataBuf = new byte[received]; 
     Array.Copy(receivedBytes, dataBuf, received); 
     msg = (Encoding.ASCII.GetString(dataBuf)); 
     Console.WriteLine("Message Received: " + msg); 
     receiveDone.Set(); 
    }catch (SocketException e){ 
     if (e.SocketErrorCode == SocketError.TimedOut){ 
      Console.WriteLine("SocketExecption => Timeout"); 
     }else{ 
      Console.WriteLine("SocketExecption => " + e.ToString()); 
     } 
    }catch (Exception e){ 
     Console.WriteLine("Execption => " + e.ToString()); 
    } 
} 

データは受信していますが、ReceiveTimeoutは10000に設定されていますが、動作していません。 ReceiveTimeoutを間違った行に入れましたか?もしそうなら、私はどこでReceiveTimeoutを初期化すべきですか?

ReceiveTimeoutが設定され、動作している以下のコードが見つかりましたが、私はBeginReceive()メソッドを使用することをお勧めします。

try{ 
    byte[] byt = new byte[65535]; 
    socket.ReceiveTimeout = 10000; 
    socket.Receive(byt); 
    Console.WriteLine("Message: " + Encoding.UTF8.GetString(byt)); 
}catch (SocketException e){ 
    if (e.SocketErrorCode == SocketError.TimedOut) 
    { 
     Console.WriteLine("TimeOut"); 
    }else{ 
     Console.WriteLine("Unknown SocketExecption: " + e.ToString()); 
    } 
}catch (Exception e){ 
    Console.WriteLine("Unknown Exception:" + e.ToString()); 
} 

これは、ReceiveTimeoutを設定すると混乱します。

答えて

1

可能な重複: How to handle timeout in Async Socket?

て、ReceiveTimeoutは、非同期呼び出しのために動作しません。提案された解決策は、独自のタイマーを使用することです。 Socket.ReceiveTimeoutについては、MSDNから

このオプションは、同期に適用されるだけで通話を受信します。タイムアウト時間を超えると、ReceiveメソッドはSocketExceptionをスローします。

関連する問題