高效的数据包处理?

时间:2014-03-30 09:42:24

标签: c# networking tcpclient

我在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是一个简单的传递函数,它根据需要传递缓冲区和额外信息,以处理接收到的数据包。

1 个答案:

答案 0 :(得分:1)

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

没有“有效处理”之类的东西 - 它完全取决于背景。对于一种使用模式而言,有效性对另一种使用模式来说效率非常低。并发连接数和读取频率是关键因素。