如果我这样做:
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
传递:
- 可能为了与 WinSock 函数保持一致,
EndPoint
由调用者分配,因此由ref
传递。 - 也许
EndPoint
在某些时候被认为是一个可选参数,但这从未被实现(我检查过,它必须是非空的)。 - 也许对于某些协议(protocol),处理方向通过
EndPoint
参数传递。甚至 future 的协议(protocol) :-)
关于c# - 不确定将 EndPoint 传递给 Socket.ReceiveFrom(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9180328/