2

我正在编写一个在本地网络上工作的基于客户端/服务器的应用程序,为了在客户端和服务器之间交换数据,我创建了一个非常简单的NetworkCommand对象,该对象被转换为byte[]并使用TCPor发送UDP

问题是end-of-packed正确标记,

现在我已经使用byte[] {0, 0, 0} 和结束数据包标记,但这似乎在整个数据包本身中重复了太多次。

那么,我如何安全地标记end-of-packet

网络命令.cs

using System;
using System.IO;

namespace Cybotech.Common
{
    public enum CommandType
        {
            NeedIP = 1,
            IPData = 2,
        }

    public class NetworkCommand
    {
        public NetworkCommand(CommandType type, byte[] data)
        {
            Command = type;
            Data = data;
        }

        public int Length
        {
            get { return Data.Length; }
        }

        public byte[] Data { get; set; }
        public CommandType Command { get; set; }

        public byte[] ToBytes()
        {
            MemoryStream stream = new MemoryStream();

            //write the command type
            byte[] data = BitConverter.GetBytes((int) Command);
            stream.Write(data, 0, data.Length);

            //append the length of the data
            data = BitConverter.GetBytes(Length);
            stream.Write(data, 0, data.Length);

            //write the data
            stream.Write(Data, 0, Data.Length);

            //end of packer marker
            data = new byte[] {0, 0, 0};
            stream.Write(data, 0, 3);

            data = stream.ToArray();
            stream.Close();
            stream.Dispose();
            return data;

        }

        public static NetworkCommand CreateNetworkCommand(byte[] bytes)
        {
            MemoryStream stream = new MemoryStream(bytes);
            BinaryReader reader = new BinaryReader(stream);

            CommandType type = (CommandType) reader.ReadInt32();
            int length = reader.ReadInt32();
            byte[] data = reader.ReadBytes(length);
            byte[] endMarker = reader.ReadBytes(3);

            NetworkCommand cmd = new NetworkCommand(type, data);
            reader.Close();
            stream.Close();
            stream.Dispose();
            return cmd;

        }

    }
}
4

1 回答 1

2

一种策略是使用表示数据包大小的 4 字节数字开始数据包,然后在其后加上适当数量的有效负载数据字节。然后你就知道你需要在接收端读取多少数据。

TCP 是一种可靠的协议,因此您不必太在意同步问题。另一方面,它是面向流的,由于您使用的是基于数据包的应用层,您可能会发现使用面向消息的 UDP 更容易。

如果使用 UDP,则可以使用 4 字节长度,后跟任意“开始”字符(如[),然后是有效负载,最后是“停止”字符(如])。如果您读取的数据包不以停止字符结尾,您可以将其丢弃,并通过下一个停止字符继续丢弃数据。但是你需要一种方法来要求发件人重新传输丢失的数据。

一个好的协议会利用底层,所以你不需要复制它们的特性。

于 2013-06-08T01:57:24.753 回答