【问题标题】:Unsureness about passing EndPoint to Socket.ReceiveFrom()不确定将 EndPoint 传递给 Socket.ReceiveFrom()
【发布时间】:2012-02-29 02:54:41
【问题描述】:

如果我这样做:

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 方法是否只接收来自正在传递的端点的数据包?文档说明如下:

对于无连接协议,ReceiveFrom 将读取第一个 入队的数据报接收到本地网络缓冲区。

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

【问题讨论】:

  • 经过几次测试后,我发现通过的端点值无关紧要。它仅用于存储。但是我仍然不知道为什么它必须作为参考传递。
  • EndPoint 不是结构体吗?
  • 是的,你是对的。虽然这对我的情况没有影响。
  • 使用 sock.ReceiveFrom() 而不是列出的 remote.ReceiveFrom() 可能会更好。
  • 为什么我总是犯那些愚蠢的错字?这就是我的意思,对不起。

标签: c# sockets reference udp endpoint


【解决方案1】:

注意ReceiveFrom 方法是recvfrom WinSock 函数的托管包装。这个函数接受一个指向sockaddr 结构的指针,该结构是可选的,在调用者端分配/释放。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2021-12-24
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多