C# 高效的数据包处理?

C# 高效的数据包处理?,c#,networking,tcpclient,C#,Networking,Tcpclient,我已经用C#创建了一个服务器,并试图有效地处理来自客户端的数据。我目前有以下代码用于检查客户端线程上的客户端数据包: if ( myStream.DataAvailable == true && myStream.CanRead ) { int mySize = myStream.ReadByte(); myBuffer = new byte[ mySize ]; await myStream.ReadAsync( myBuffer, 0, mySize

我已经用C#创建了一个服务器,并试图有效地处理来自客户端的数据。我目前有以下代码用于检查客户端线程上的客户端数据包:

if ( myStream.DataAvailable == true && myStream.CanRead ) {
    int mySize = myStream.ReadByte();
    myBuffer = new byte[ mySize ];
    await myStream.ReadAsync( myBuffer, 0, mySize );
    ushort myPeek = 0;
    Net_Messages.Net_Read( myStream, myID, myBuffer, myPeek, myThreading );
}
所以我的问题是,对于从每个客户机接收到的每个数据包,将数据流中的数据存储到缓冲区是否有效?我应该有一个固定的预定义缓冲区,而不是为每个数据包检索创建一个新的缓冲区吗

我应该如何写数据呢?为每个客户端创建一个固定的预定义缓冲区,在该缓冲区上存储数据并发送缓冲区

预定义缓冲区的问题是,当我可以为每个数据包创建一个正确大小的新缓冲区时,通过创建一个不必要的缓冲区来分配不需要的额外内存


注意:Net_Read是一个简单的传递函数,用于传递缓冲区和处理接收到的数据包所需的额外信息。

如果这是您的意思,您当然不应该通常为每次读取分配新的缓冲区。但除此之外,这在很大程度上取决于上下文。例如,如果传入数据很少(例如web套接字),您可能希望使用一个很小的缓冲区(甚至只有一个字节)进行异步读取,然后在数据可用时使用一个较大的缓冲区(可能来自池)。或者您可能想使用套接字轮询代替!对于更繁忙的连接,每个连接使用两个缓冲区并不少见——一个用于读取的固定大小缓冲区,另一个(可能是MemoryStream)作为后台缓冲区,同时检查整个帧(可能通过多次读取)。有时您可以将它们组合在一起(例如,SE.Redis使用读取缓冲区作为后缓冲区,如果需要,可以调整其大小,如果可以使用一些帧但有剩余数据,则可以在缓冲区中向后复制数据)


没有“有效处理”这样的东西——它完全取决于上下文。对于一种使用模式有效的东西对于另一种使用模式可能非常低效。并发连接的数量和读取的频率是关键因素。

有道理,谢谢您提供的信息。:)另外,我不相信我可以使用TcpListener类访问套接字轮询。@FatalSleep我不知道:我实际上只使用socket类。抽象添加的东西很少,占用的东西也很多。它不像套接字那样高效,而且确实缺少一些特性,但更容易实现。如果您碰巧有一个基于套接字的教程而不是TcpClient,我洗耳恭听。@fatalsleep的“打开套接字,使用套接字,关闭套接字”算不算教程?:)是的,很重要。:)