来自 Socket 的 UWP SendToAsync 导致 AddressFamilyNotSupported

UWP SendToAsync from Socket results in AddressFamilyNotSupported

提问人:Noires 提问时间:3/3/2017 最后编辑:CSDevNoires 更新时间:2/11/2021 访问量:574

问:

我正在使用 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
    }
}
C# 套接字异 UDP UWP

评论

1赞 Sunteen Wu 3/7/2017
你检查过这个吗?是否为 uwp 应用启用了必要的功能?我看到您没有将套接字相对 API 用于 Windows 运行时,而是使用 .Net 套接字,我能知道为什么吗?顺便问一下,具体设备是什么?您是否有条件更改设备进行测试?
1赞 Noires 3/7/2017
问题是网络连接可以来回发送几次。我已经使用同步读写方法成功执行了 uwp 测试。不过我不明白第三个问题。发送的设备是我的笔记本电脑,另一个设备是用于测试目的的特定硬件设备。
0赞 MetaColon 3/21/2017
尽管使用了其他一些差异,但实际上还有其他一些差异 - 您是否在不使用的情况下尝试过,但进行了其他更改?然后你可以把问题最小化......

答:

0赞 gog 2/11/2021 #1

我假设你被存储为类成员,并且因为你说这是在初始化中完成的。m_SocketReceiveEventArgs

因此,您在每次发送时都重复使用相同的内容。m_SocketReceiveEventArgs

请查看 MS 文档中关于传递给 SendToAsync(SocketAsyncEventArgs) 方法的参数的内容:

要用于此异步套接字的 SocketAsyncEventArgs 对象 操作。

我是这样理解的:你应该为每个新调用传递一个新参数。SocketAsyncEventArgsSendToAsync

我认为这解释了为什么将它放在 using 代码块中会使该代码正常工作:它实际上是为每个修复代码的调用使用一个新参数。