2016-01-12 168 views
0

我正嘗試使用套接字連接到應用程序。無法從服務器接收消息的套接字

應用程序使用端口6100進行通信。 我能夠將消息發送到應用程序,但無法接收任何消息。

這是我的代碼,請讓我知道如果我做錯了什麼。

public void Connect2(string host, int port, string cmd) 
{ 
    byte[] bytes = new byte[10024]; 
    IPAddress[] IPs = Dns.GetHostAddresses(host); 

    Socket s = new Socket(AddressFamily.InterNetwork, 
    SocketType.Stream, 
    ProtocolType.Tcp); 
    s.SendTimeout = 100; 
Console.WriteLine("Establishing Connection to {0}", 
    host); 
    try 
    { 
     s.Connect(IPs[0], port); 
    } 

    catch (Exception e) 
    { 

     MessageBox.Show(e.Message); 
    } 



    byte[] sendBites = System.Text.Encoding.ASCII.GetBytes(cmd); 
    int bytesSent = s.Send(sendBites); 
    int bytesRec = s.Receive(bytes); 
    s.ReceiveFrom(bytes, ref tmpRemote); 
    MessageBox.Show(s.ReceiveBufferSize.ToString()); 
    MessageBox.Show(Encoding.ASCII.GetString(bytes, 0, bytesRec)); 
    s.Shutdown(SocketShutdown.Both); 
    s.Close(); 

} 

回答

0

這段代碼工作正常

 public string SocketSendReceive(string server, int port, string cmd) 
    { 
     byte[] recvBuffer = new byte[1024]; 
     string host = "127.0.0.1"; 
     TcpClient tcpClient = new TcpClient(); 
     try 
     { 
      tcpClient.Connect(host, 6100); 
     } 
     catch (SocketException /*e*/) 
     { 
      tcpClient = null; 
     } 


     if (tcpClient != null && tcpClient.Connected) 
     { 

      tcpClient.Client.Send(Encoding.UTF8.GetBytes(cmd)); 
      tcpClient.Client.Receive(recvBuffer); 
      // port = Convert.ToInt16(Encoding.UTF8.GetString(recvBuffer).Substring(2)); 
      tcpClient.Close(); 

     } 

     return Encoding.ASCII.GetString(recvBuffer, 0, recvBuffer.Length); 
    } 
+0

此代碼已損壞。它無法檢查來自'Receive'的返回值,它告訴你有多少個字節已經放入緩衝區。 TCP是字節流。如果你想要「消息傳遞」,你可以自己在TCP之上實現消息組幀,或者移動到已經提供消息的更高層抽象。 –

0

首先,當連接失敗時,您仍然嘗試發送/接收數據。將發送和接收置於try/catch中。


我可以看到你打電話收到兩次:

int bytesRec = s.Receive(bytes); 
s.ReceiveFrom(bytes, ref tmpRemote); 

什麼可能發生的情況是:

  • 您發送命令
  • 您正在等待響應「int bytesRec = s.Receive(bytes);
  • 然後再次等待更多數據。「s.ReceiveFrom(bytes,ref tmpRemote);

不過,也許服務器不會發送額外的數據,讓你在等待‘永遠’

再次嘗試取出s.ReceiveFrom(bytes, ref tmpRemote);


Socket.ReceiveFrom()通常用於接收UDP廣播

+0

我已經更改了代碼,但仍然是我的應用程序掛起,我沒有收到任何錯誤消息。 –

+0

嘗試 s.Connect(IPs [0],port); byte [] sendBites = System.Text.Encoding.ASCII.GetBytes(cmd); int bytesSent = s.Send(sendBites); int bytesRec = 0; do bytesRec = s.Receive(bytes,bytes.Length,0); } while(bytesRec> 0); } 趕上(例外五) { MessageBox.Show(e.Message); } –

相關問題