我正在开发一个应用程序,我需要通过套接字连接发送命令,然后接收它发回的数据。发送命令后,我很难从服务器上取回任何东西。我最初被告知要用二进制0"结束包,我认为这可能会让我失望,因为我不确定如何在c#中执行此操作。这是一些源代码:
Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
sender.Connect(remoteEp);
Console.WriteLine("Socket connected to {0}", sender.RemoteEndPoint.ToString());
byte zero = Encoding.Default.GetBytes("0")[0];
byte[] msg = Encoding.ASCII.GetBytes("PACK_ALARM.ALARM_GETCOUNTI,294,0" + zero);
int bytesSent = sender.Send(msg);
int bytesReceived = sender.Receive(bytes);
Console.WriteLine("Test = {0}", Encoding.ASCII.GetString(bytes, 0, bytesReceived));
sender.Shutdown(SocketShutdown.Both);
sender.Close();
}
catch (ArgumentNullException ane)
{
Console.Write("ArgumentNullException : {0}", ane.ToString());
}
catch (SocketException se)
{
Console.WriteLine("Socket Exception : {0}", se.ToString());
}
catch (Exception e)
{
Console.WriteLine("Unexpected exception : {0}", e.ToString());
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
答案 0 :(得分:1)
你没有发送二进制零。您正在发送字符'0'
的ASCII表示,转换为数字,转换为字符串。
相反,只需这样做:
byte[] msg = Encoding.ASCII.GetBytes("PACK_ALARM.ALARM_GETCOUNTI,294,0\0");
\0
是空字符的文字 - 二进制零。
另请注意,TCP是流协议,而不是基于消息的协议。在获得整个消息之前,您应该将Receive
保持在循环中。对于简短但不常见的消息,您的代码可能会起作用(不可靠),但任何真正的通信都会导致可怕的混乱。