2017-04-20 14 views
0

私はTCP-IP接続にソケットを使用しています。クライアント側から簡単なシステムの送受信を確立したいと考えています。C#クライアントソケット複数の送受信

Socket sck; 
     sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     IPEndPoint localEndpt = new IPEndPoint(IPAddress.Parse("123.123.123.1"), 12345); 
     try 
     { 
      sck.Connect(localEndpt); 
     } 
     catch 
     { 
      Console.Write("Unable to Connect"); 
     } 
     while (true) 
     { 
      Console.WriteLine("Enter Text"); 
      string sendtext = Console.ReadLine(); 
      byte[] Data = Encoding.ASCII.GetBytes(sendtext); 
      sck.Send(Data); 
      Console.WriteLine("Data Sent!"); 

      byte[] bytesReceived = new byte[sck.ReceiveBufferSize]; 
      int bytes = 0; 
      String strReceived = ""; 

      int dataAvailable = 0; 
      while (dataAvailable == 0 || dataAvailable != sck.Available) 
      { 
       dataAvailable = sck.Available; 
       Thread.Sleep(100); // if no new data after 100ms assume transmission finished 
      } 

      if (sck.Available > 0) 
      { 
       bytes = sck.Receive(bytesReceived, bytesReceived.Length, 0); 
       strReceived+=Encoding.ASCII.GetString(bytesReceived, 0, bytes); 
      } 

      Console.WriteLine("Received from server: " + strReceived); 
     } 
     Console.Read(); 

問題はソケットが(ソケット「空く」属性の値が0である)もう使用できないため、最初の要求はthrought行くが、2番目にはないということです。私は間違って何をしていますか?複数のsend-recieveリクエストを(順番に)確立する最も簡単な方法は何でしょうか?

答えて

0

Socket. Availableは、ソケットが利用可能ですが、入ってくるデータは読み込みのために利用可能であるかどうかを示すものではありません:
https://msdn.microsoft.com/en-us/library/ee425135.aspx

それはリプライ(受信データ)を調べるので、あなたのプログラムはすぐにメッセージを送信した後に終了します。データを確認する前にThread.Sleepを使用してください。

Socket.Sendはネットワークインターフェイスカードの出力バッファに置くだけなので、メッセージが送信されていない可能性もあります。ソケットが最終的にメッセージを送信すると、接続状態が確立します。応答がない場合(TCP接続で)、状態を照会するときに接続が切断されたことが通知されます。 UDPではコネクションレスなので、何も教えてくれません。

0

このコードは

private List<Socket> _clients = new List<Socket>(); 
    private Thread _dataReceiveThread; 
    private bool _isConnected; 

    private void DataReceive() 
    { 
     while (_isConnected) 
     { 
      List<Socket> clients = new List<Socket>(_clients); 
      foreach (Socket client in clients) 
      { 
       try 
       { 
        if (!client.Connected) continue; 
        string txt = ""; 
        while (client.Available > 0) 
        { 
         byte[] bytes = new byte[client.ReceiveBufferSize]; 
         int byteRec = client.Receive(bytes); 
         if (byteRec > 0) 
          txt += Encoding.UTF8.GetString(bytes, 0, byteRec); 
        } 
        if (!string.IsNullOrEmpty(txt)) 
         /* Here you can access the text received in the "txt" */ 
       } 
       catch (Exception e) 
       { 
        Exception_Handler(e); 
       } 
      } 
     } 
    } 

私のために正常に動作するだけ

_isConnected = true; 
_dataReceiveThread = new Thread(DataReceive); 
_dataReceiveThread.Start(); 
を始めるためにこのコードを実行します
関連する問題