2017-01-19 10 views
0

TCPでリッスンするとデータを送信できません。すべての受信接続をリッスンする必要があり、必要なときにデータを送信する必要があります。ときに、プログラムのロード聞くが、私は、データを送信しようとすると、それは、このエラーを与えるしますTCP-サーバとしてリッスンするときにデータを送信できません

"Only one usage of each socket address (protocol/network address/port) is normally permitted (typically under load)."

そしてここでは、私のコードは次のとおりです。

public void Send(object sender, System.EventArgs e) 
    { 
     String str = "08"; 
     String str2 = "4213"; 
     String CRCvalue = CRC("08" + str2); 
     String str3 = str2 + CRCvalue; 
     Connect("localhost", "hello localhost " + Guid.NewGuid()); 
    } 
    static void Connect(String server, String message) 
    { 

      try 
       {    
         Int32 port = 2101; 
         TcpClient client = new TcpClient(server, port);    
         Byte[] data = System.Text.Encoding.ASCII.GetBytes(message); 
         NetworkStream stream = client.GetStream(); 

         // Send the message to the connected TcpServer. 
         stream.Write(data, 0, data.Length); 
         System.Diagnostics.Debug.WriteLine("Sent");   
         stream.Close(); 
         client.Close(); 
       } 
      catch (ArgumentNullException e) 
      { 
       System.Diagnostics.Debug.WriteLine("ArgumentNullException: {0}", e); 
      } 
      catch (SocketException e) 
      { 
       System.Diagnostics.Debug.WriteLine("SocketException: {0}", e); 
      }} 
     protected override void OnLoad(EventArgs e) 
    { 
     CreateServer(); 
    } 
     private static void CreateServer() 
     { 
      var tcp = new TcpListener(System.Net.IPAddress.Any,25565); 
      tcp.Start(); 



      var listeningThread = new Thread(() => 
      { 
       while (true) 
       { 
        var tcpClient = tcp.AcceptTcpClient(); 
        ThreadPool.QueueUserWorkItem(param => 
        { 
         NetworkStream stream = tcpClient.GetStream(); 
         string incomming; 
         byte[] bytes = new byte[1024]; 
         int i = stream.Read(bytes, 0, bytes.Length); 
         incomming = System.Text.Encoding.ASCII.GetString(bytes, 0, i); 
         System.Diagnostics.Debug.WriteLine(incomming); 
         tcpClient.Close(); 
        }, null); 
       } 
      }); 

任意の助けがapprecitatedされます。

+1

"データを送信しようとする"コードを表示できますか?あなたが質問に持っているコードは、メッセージを送信し、データを聞くための方法を示しています.Connect()は実際にどこに使われていますか? 例外がスローされる場所、Connect()メソッド、またはCreateServer()メソッドに記載されている場所は? – Ben

+0

サイドノート:TCPは(各方向の)バイトストリームであり、メッセージングではないことに注意してください。 'Read'の呼び出しから得られるものが、もう一方の' Write'の呼び出しと1-1で一致するという保証はありません。 –

+0

私は今それを追加しました。 –

答えて

0

例外は、同じサーバーソケットを複数回開こうとしていることを示しています。フォームの終了時にTcpListenerを閉じて(リスニングスレッドに参加する)また、tcpリスナーを管理する(または静的フィールドを割り当て、フィールドが設定されていない場合にのみリスナーを作成する)シングルトンサービスを使用することもできます。

関連する問題