Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理.NET套接字的返回值';使用多个缓冲区时s EndSend in回调(分散/聚集)_C#_.net_Sockets - Fatal编程技术网

C# 处理.NET套接字的返回值';使用多个缓冲区时s EndSend in回调(分散/聚集)

C# 处理.NET套接字的返回值';使用多个缓冲区时s EndSend in回调(分散/聚集),c#,.net,sockets,C#,.net,Sockets,我想让我的TCP服务器使用/EndSend(使用多个缓冲区分散/收集,而不是使用BeginSend的单缓冲区版本),以减少内存分配和复制操作的数量。我仍然可以使用BeginSend(Byte[],Int32,Int32,SocketFlags,AsyncCallback,Object)来发送数据包头,但数据包的实际内容是另一回事——有很多大块缓存数据,它们可能相互重叠。目前,我正在分配一个非常大的缓冲区,并将这些块复制到该缓冲区。确切地说,这不是一个好主意,我想明确地重用已经分配和缓存的数据块

我想让我的TCP服务器使用/EndSend(使用多个缓冲区分散/收集,而不是使用BeginSend的单缓冲区版本),以减少内存分配和复制操作的数量。我仍然可以使用
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抽象异步处理部分,代码可以简化并更容易解释。