C# 处理.NET套接字的返回值';使用多个缓冲区时s EndSend in回调(分散/聚集)
我想让我的TCP服务器使用/EndSend(使用多个缓冲区分散/收集,而不是使用BeginSend的单缓冲区版本),以减少内存分配和复制操作的数量。我仍然可以使用C# 处理.NET套接字的返回值';使用多个缓冲区时s EndSend in回调(分散/聚集),c#,.net,sockets,C#,.net,Sockets,我想让我的TCP服务器使用/EndSend(使用多个缓冲区分散/收集,而不是使用BeginSend的单缓冲区版本),以减少内存分配和复制操作的数量。我仍然可以使用BeginSend(Byte[],Int32,Int32,SocketFlags,AsyncCallback,Object)来发送数据包头,但数据包的实际内容是另一回事——有很多大块缓存数据,它们可能相互重叠。目前,我正在分配一个非常大的缓冲区,并将这些块复制到该缓冲区。确切地说,这不是一个好主意,我想明确地重用已经分配和缓存的数据块
BeginSend(Byte[],Int32,Int32,SocketFlags,AsyncCallback,Object)
来发送数据包头,但数据包的实际内容是另一回事——有很多大块缓存数据,它们可能相互重叠。目前,我正在分配一个非常大的缓冲区,并将这些块复制到该缓冲区。确切地说,这不是一个好主意,我想明确地重用已经分配和缓存的数据块
在这种情况下看起来很有用,但我不知道如何在回调中处理EndSend的返回值:
// ...
// This method will allocate header, set the opcode and total length of the
// packet, than create a list of array segments to hold header and each chunk
// buffer
var packetBuffer = PacketFactory.GetPacketBuffer(opcode, chunks, _socket);
_socket.BeginSend(packetBuffer.Buffers, SocketFlags.None, OnSendComplete, packetBuffer);
// ...
// in OnSendComplete
var buffer = ar.AsyncState as PacketBuffer;
try
{
int bytesReceived = buffer.Socket.EndSend(ar);
if (bytesReceived > 0)
{
// It is possible this value is less than total size of my buffers?
// If so, how do i handle it?
// In case of the single buffer, all i need to do is increase the
// current buffer position, calculate bytes left and invoke BeginSend
// once again
}
}
catch { ... }
有谁能帮助我或提供一个如何使用多个发送缓冲区的代码片段吗?您附加的两个链接都不起作用。对不起。现在应该没事了!您使用的是什么版本的.NET?我认为,通过使用TPL抽象异步处理部分,代码可以简化并更容易解释。