gpt4 book ai didi

c# - 使用 Receive[...]Async 方法时获取远程端点信息 - 仅供引用

转载 作者:行者123 更新时间:2023-11-30 15:20:58 37 4
gpt4 key购买 nike

这是一个 Windows .net 烦恼,我花了 2 天时间才解决。我发现解决方案很重要,足以让我自己在 SO 喋喋不休,即。给别人一个明确的陈述重新。方法。

问题:我使用 ReceiveAsync() 的无连接 (UDP) 套接字没有发送方 IP 地址

.net 提供了很好的高性能 Receive[...]Async 方法,这些方法优于 BeginGetResponce -> (callback) -> BeginReceive -> (callback) 的传统异步方法链-> EndReceive,因为 Receive[...]Async 方法重用了 SocketAsyncEventArgs。您可以维护一个 SocketAsyncEventArgs 池并将它们中的任何一个传递给 Receive[...]Async。当 Receive[...]Async 引发 Completed 回调时,SocketAsyncEventArgs(及其 Buffer 属性)为您提供有效负载。重新使用会影响 .net 垃圾袋。

但是: SocketAsyncEventArgs.RemoteEndPoint 产生异常。与 SocketAsyncEventArgs.ReceiveMessageFromPacketInfo 一样。用 (IPAddress.Any 0) 预填充 RemoteEndPoint 只会导致 RemoteEndPoint 说 0.0.0.0:0 - 没用!执行 SetSocketOption(SocketOptionLevel.IP, SocketOptionName.PacketInformation, True) 无效。似乎不是获取远程 IP 地址的好方法。

网上充满的问题。这个但是没有具体的答案。所以主机确实回答了问题(主要是 1 个好的 1,现在我知道要寻找什么),但也有很多不相关的模糊问题。

在下面回答。

最佳答案

ReceiveAsync - 不行
ReceiveFromAsync - 不行
ReceiveMessageFromAsync - 去

这些方法的设计和外观几乎相同。 Ofc 首先尝试 ReceiveAsync。 ReceiveAsyncWithHeaderInfo 引起了我的注意...

一个。沿着这个创建套接字:

so = Socket.New(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)

B.另外(伪),做一个:

so.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.PacketInformation, True)

在将套接字绑定(bind)到本地端点之前。这并不重要,因为第一个 Completed 回调无论如何都会将其设置为 True。但是如果没有提前设置,你会丢失第一个数据包。

C.为 ReceiveMessageFromAsync 构造 SocketAsyncEventArgs 时,将其 RemoteEndPoint 属性设置为

SocketAsyncEventArgs.RemoteEndPoint = IPEndPoint.New(IPAddress.Any, 0)

如果未设置,ReceiveMessageFromAsync 将崩溃,因此这很关键。 IPAddress.Any 和端口 0 并不重要,.net 会在数据传入时更新它们,因此设置 RemoteEndPoint 仅提供 Microsoft 写入空间。哈利路亚。

(D. 自然地在 SocketAsyncEventArgs 中创建缓冲区和回调,如各种示例所示)

_ _

MS 可以将此注释添加到 no-go 方法的文档中:

“如果您需要发件人 IP 地址(您可能需要),请不要使用 ReceiveAsync 或 ReceiveFromAsync,请使用 ReceiveMessageFromAsync”。

现在您有一个 RemoteEndPoint.Address 和端口 :-)。

关于c# - 使用 Receive[...]Async 方法时获取远程端点信息 - 仅供引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38798746/

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