在c#/ .Net中通过套接字连接发送二进制0

时间:2015-04-16 15:49:03

标签: c# .net sockets binary

我正在开发一个应用程序,我需要通过套接字连接发送命令,然后接收它发回的数据。发送命令后,我很难从服务器上取回任何东西。我最初被告知要用二进制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());
        }

1 个答案:

答案 0 :(得分:1)

你没有发送二进制零。您正在发送字符'0'的ASCII表示,转换为数字,转换为字符串。

相反,只需这样做:

byte[] msg = Encoding.ASCII.GetBytes("PACK_ALARM.ALARM_GETCOUNTI,294,0\0");

\0是空字符的文字 - 二进制零。

另请注意,TCP是流协议,而不是基于消息的协议。在获得整个消息之前,您应该将Receive保持在循环中。对于简短但不常见的消息,您的代码可能会起作用(不可靠),但任何真正的通信都会导致可怕的混乱。