我可以将 SetBuffer 与 SocketAsyncEventArgs 一起使用就好了。
如果我尝试使用 BufferList(在执行 SetBuffer(null, 0, 0) 之后),当我在套接字上执行 SendAsync 时,我总是立即得到 SocketError InvalidArgument (10022)。
没有关于如何使用 BufferList 的示例或文档,我正在做的事情很有意义(无论如何对我来说)。
有人可以指出一个示例程序或代码片段吗?
我正在为此撕心裂肺,所剩无几......
这基本上是我在做什么(e 是 SocketAsyncEventArgs 和 lSocket 是我用于 SetBuffer 的同一个套接字,它可以工作)
// null the buffer since we will use a buffer list
e.SetBuffer(null, 0, 0);
// create a bufferlist
e.BufferList = new List<ArraySegment<byte>>();
// create the bufferlist with the network header and the response bytes
e.BufferList.Add(new ArraySegment<byte>(lTxBytes)); // add the 4 character total length
e.BufferList.Add(new ArraySegment<byte>(Encoding.ASCII.GetBytes(lTx.Identity))); // echo back the incoming sequence number
e.BufferList.Add(new ArraySegment<byte>(Encoding.ASCII.GetBytes(lResponse)));
// *** the SendAsync always completes IMMEDIATELY (returns false) gets SocketError InvalidArgument (10022)
if (lSocket.SendAsync(e) == false)
{
// data was already sent back to the client.
AppSupport.WriteLog(LogLevel.Flow, "ProcessReceive had SendAsync complete synchronously (bytes transferred {0}).", e.BytesTransferred);
ProcessSend(e);
}
最佳答案
您收到异常的原因是,在设置 SocketAsyncEventArgs
属性时,BufferList
仅使用列表中存在的缓冲区。
基本上,您正在尝试使用以下代码发送空缓冲区:
e.BufferList = new List<ArraySegment<byte>>();
e.BufferList.Add(new ArraySegment<byte>(lTxBytes));
e.BufferList.Add(new ArraySegment<byte>(Encoding.ASCII.GetBytes(lTx.Identity)));
e.BufferList.Add(new ArraySegment<byte>(Encoding.ASCII.GetBytes(lResponse)));
而是尝试做:
var list = new List<ArraySegment<byte>>();
list.Add(new ArraySegment<byte>(lTxBytes));
list.Add(new ArraySegment<byte>(Encoding.ASCII.GetBytes(lTx.Identity)));
list.Add(new ArraySegment<byte>(Encoding.ASCII.GetBytes(lResponse)));
e.BufferList = list;
这种行为根本没有得到很好的记录,只能通过详细查看
BufferList
setter 代码来理解。在幕后,SocketAsyncEventArgs
有一个 WSABuffer
数组字段(用于与 native 代码的互操作),当您设置 BufferList
时,它会在其中复制和固定字节数组引用。由于发送到 native 代码的是这个 WSABuffer[]
,这就解释了为什么您的代码会引发异常。关于c# - 如何将BufferList与SocketAsyncEventArgs结合使用,而不获取SocketError InvalidArgument?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11820677/