如何处理客户端/服务器应用程序代码中的网络数据包?



我正在使用 C# 创建一个客户端/服务器应用程序,我想知道处理 C# 代码中数据包的最佳方法。

从我读到的内容来看,我可以 A( 使用 Marshal 类从数据包原始缓冲区构造一个安全类,或者 B( 在不安全的上下文中使用原始指针将数据包缓冲区直接转换为结构体并在我的代码中使用它。

我可以看到这两种方法都存在很大问题。例如,使用 Marshal 似乎非常麻烦且难以维护(与指针解决方案相比(,另一方面,在 C# 中使用指针非常有限(例如,我什至无法声明非原始类型的固定大小数组,这是此类应用程序中的交易破坏者(。

也就是说,我想知道这两种方法中的哪一种更适合处理网络数据包,以及是否有其他更好的方法。我对任何其他可能的解决方案持开放态度。

PS.:我实际上是在为已经存在的客户端/服务器应用程序创建自定义客户端,因此客户端和服务器之间的通信协议已经创建并且无法修改。因此,我的 C# 客户端需要遵守这个已经存在的协议来了解其较低级别的详细信息(例如,数据包中每个信息的二进制偏移量是固定的,需要得到尊重(。

处理网络数据包的最佳方法。 您必须创建附加到实际数据包标头的有效负载,并且接收客户端始终首先读取标头并将其转换为实际长度。 然后设置您在标头中收到的缓冲区长度。 它将完美工作而不会丢失任何数据包。 它还将改善内存泄漏问题。 您无需创建硬编码数组来获取缓冲区字节。只需将实际字节长度附加到数据包的标头即可。它将动态设置缓冲区字节。

喜欢。

public void SendPackettoNetwork(AgentTransportBO ObjCommscollection, Socket Socket)
{
try
{
byte[] ActualBufferMessage = PeersSerialization(ObjCommscollection);
byte[] ActualBufferMessagepayload = BitConverter.GetBytes(ActualBufferMessage.Length);
byte[] actualbuffer = new byte[ActualBufferMessage.Length + 4];
Buffer.BlockCopy(ActualBufferMessagepayload, 0, actualbuffer, 0, ActualBufferMessagepayload.Length);
Buffer.BlockCopy(ActualBufferMessage, 0, actualbuffer, ActualBufferMessagepayload.Length, ActualBufferMessage.Length);
Logger.WriteLog("Byte to Send :" + actualbuffer.Length, LogLevel.GENERALLOG);
Socket.Send(actualbuffer);
}
catch (Exception ex)
{
Logger.WriteException(ex);
}
}

只需传递传输类对象即可。 在这里使用你的序列化方法 我使用了类对象的二进制格式化程序序列化

最新更新