Cyr*_*iac 10 c# sockets asynchronous udp uwp
我正在使用UWP 的Socket类通过UDP将数据发送到特定设备.
问题是,经过几次发送和返回后,我的SocketAsyncEventArgs发送被卡住了,在SocketError中我得到了AddressFamilyNotSupported.
类的初始化就是这样完成的
m_Socket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);
m_Socket.Bind(new IPEndPoint(IPAddress.Any, 51020));
m_SocketReceiveEventArgs = new SocketAsyncEventArgs();
m_SocketReceiveEventArgs.Completed += SocketArgsReceived;
m_SocketReceiveEventArgs.SetBuffer(m_ReceivingBuffer, 0,m_ReceivingBuffer.Length);
m_SocketSendEventArgs = new SocketAsyncEventArgs();
m_SocketSendEventArgs.Completed += SocketArgsSend;
Run Code Online (Sandbox Code Playgroud)
当我发送via时(循环的条件仅用于测试目的):
m_SocketSendEventArgs.SetBuffer(aunReqBuffer, 0,aunReqBuffer.Length);
m_Socket.SendToAsync(m_SocketSendEventArgs);
while (m_SocketSendEventArgs.BytesTransferred == 0)
{
// AddressFamilyNotSupported happens here after a few packets have been send
}
Run Code Online (Sandbox Code Playgroud)
并通过访问套接字并调用ReceiveFromAsync()来在一个单独的线程中重复接收,这是有效的.
知道它突然停止工作的原因吗?如果您需要更多信息,我很乐意帮忙.
更新08.03.2017
我将发送方法包装在using语句中,现在它可以工作了.有人能向我解释这个吗?特别是我得到的奇怪的SocketError.在我的记忆中,我已经尝试过.Dispose()手动,所以我混淆了那里有什么不同.
using (var sendargs = new SocketAsyncEventArgs())
{
sendargs.Completed += SocketArgsSend;
sendargs.RemoteEndPoint = m_remoteIpEndPoint;
sendargs.SetBuffer(aunReqBuffer, 0, aunReqBuffer.Length);
m_Socket.SendToAsync(sendargs);
while (sendargs.BytesTransferred == 0)
{
// TODO: SocketErrorHandling
}
}
Run Code Online (Sandbox Code Playgroud)
我假设您m_SocketReceiveEventArgs被存储为类成员,并且因为您说这是在初始化中完成的。
因此,您m_SocketReceiveEventArgs在每次发送时都重复使用相同的内容。
请查看 MS 文档中有关传递给SendToAsync(SocketAsyncEventArgs)方法的参数的说明:
用于此异步套接字操作的 SocketAsyncEventArgs 对象。
我是这样读的:您应该SocketAsyncEventArgs为每个新SendToAsync调用传递一个新参数。
我认为这解释了为什么将其放入 using 代码块中可以使该代码正常工作:它实际上为每个修复代码的调用使用一个新参数。