Dav*_*ave 7 .net c# system.net socketasynceventargs
我可以使用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);
}
Run Code Online (Sandbox Code Playgroud)
JJ1*_*15k 11
您获得异常的原因是,在SocketAsyncEventArgs设置BufferList属性时,仅使用列表中存在的缓冲区.基本上你试图用代码发送en空缓冲区:
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)));
Run Code Online (Sandbox Code Playgroud)
而是尝试做:
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;
Run Code Online (Sandbox Code Playgroud)
这种行为根本没有很好的记录,只能通过详细查看BufferListsetter代码来理解.在幕后,它SocketAsyncEventArgs有一个WSABuffer数组字段(用于与本机代码互操作),当你设置它时,它复制并固定字节数组引用BufferList.由于这是WSABuffer[]发送到本机代码,这解释了为什么您的代码抛出异常.
| 归档时间: |
|
| 查看次数: |
1947 次 |
| 最近记录: |