gpt4 book ai didi

c# - 如何将 BufferList 与 SocketAsyncEventArgs 一起使用而不获取 SocketError InvalidArgument?

转载 作者:太空狗 更新时间:2023-10-29 20:08:06 30 4
gpt4 key购买 nike

我可以将 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 时仅使用列表中存在的缓冲区属性(property)。基本上你试图用代码发送空缓冲区:

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 时,它会在其中复制和固定字节数组引用.既然是这个WSABuffer[]发送到 native 代码,这解释了为什么您的代码会引发异常。

关于c# - 如何将 BufferList 与 SocketAsyncEventArgs 一起使用而不获取 SocketError InvalidArgument?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11820677/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com