套接字无法从服务器接收消息

时间:2016-01-12 06:51:35

标签: c# c#-4.0 websocket c#-3.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();

}

2 个答案:

答案 0 :(得分:0)

首先,当连接失败时,您仍在尝试发送/接收数据。将send和receive放在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广播。

答案 1 :(得分: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);
    }