c# - 不确定将 EndPoint 传递给 Socket.ReceiveFrom()

标签 c# sockets reference udp endpoint

如果我这样做:

byte[] buffer = new byte[1024];
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint remote = new IPEndPoint(IPAddress.Parse("12.34.56.78"), 1337);
sock.ReceiveFrom(buffer, ref remote);

ReceiveFrom 方法是否只从正在传递的端点接收数据包?文档说明如下:

With connectionless protocols, ReceiveFrom will read the first enqueued datagram received into the local network buffer.

这是否意味着传递的 EndPoint 仅用于存储数据包所来自的主机的 EndPoint 而根本不影响 ReceiveFrom 方法的行为?如果是这样,为什么需要将其作为“ref”而不是“out”传递?

最佳答案

请注意,ReceiveFrom 方法是 recvfrom 的托管包装器WinSock 函数。此函数采用指向 sockaddr 结构的指针,该结构是可选的,并在调用方分配/取消分配。

考虑到这一点,我有一些理论为什么 EndPoint 作为 ref 而不是 out 传递:

  1. 可能为了与 WinSock 函数保持一致,EndPoint 由调用者分配,因此由 ref 传递。
  2. 也许 EndPoint 在某些时候被认为是一个可选参数,但这从未被实现(我检查过,它必须是非空的)。
  3. 也许对于某些协议(protocol),处理方向通过 EndPoint 参数传递。甚至 future 的协议(protocol) :-)

关于c# - 不确定将 EndPoint 传递给 Socket.ReceiveFrom(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9180328/

相关文章:

java - Android/Java关闭onClick问题?

c# - 手绘IDE模块?

c# - 为解决方案中的特定项目禁用 stylecop 分析

c++ - 是否可以在 C++ 中重置对另一个值的引用?

jquery - 在 jQuery 中通过 ID 引用元素的最佳方式是什么?

sockets - send() 之后直接关闭() 套接字 : unsafe?

c# - 需要转换类型,但 Task<TUser> 和 Task<IUser> 是否相同?

c# - 客户端 - 服务器 WebSocket 握手

c - gtk+ 的新事件(与 select 的套接字交互)

Java 和 Telnet 响应不可读