提问人:Noires 提问时间:3/3/2017 最后编辑:CSDevNoires 更新时间:2/11/2021 访问量:574
来自 Socket 的 UWP SendToAsync 导致 AddressFamilyNotSupported
UWP SendToAsync from Socket results in AddressFamilyNotSupported
问:
我正在使用 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;
当我通过发送时(循环的条件仅用于测试目的):
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
}
并通过访问套接字并调用 ReceiveFromAsync() 在单独的线程中重复接收,该线程有效。
知道为什么它突然停止工作吗? 如果您需要更多信息,我很乐意为您提供帮助。
更新 08.03.2017
我将发送方法包装在 using 语句中,现在它可以工作了。谁能向我解释一下?尤其是我得到的奇怪的 SocketError。在我的记忆中,我已经尝试过.Dispose() 手动,所以 iam 混淆了那里的不同之处。
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
}
}
答:
0赞
gog
2/11/2021
#1
我假设你被存储为类成员,并且因为你说这是在初始化中完成的。m_SocketReceiveEventArgs
因此,您在每次发送时都重复使用相同的内容。m_SocketReceiveEventArgs
请查看 MS 文档中关于传递给 SendToAsync(SocketAsyncEventArgs) 方法的参数的内容:
要用于此异步套接字的 SocketAsyncEventArgs 对象 操作。
我是这样理解的:你应该为每个新调用传递一个新参数。SocketAsyncEventArgs
SendToAsync
我认为这解释了为什么将它放在 using 代码块中会使该代码正常工作:它实际上是为每个修复代码的调用使用一个新参数。
评论