【问题标题】:Connect a UDP socket, but still receive datagrams from other sources连接一个 UDP 套接字,但仍然接收来自其他来源的数据报
【发布时间】:2019-11-04 13:30:06
【问题描述】:

是否可以像connect 那样设置 UDP 套接字的默认目的地,但又不会失去从其他来源接收数据报的能力?

我说的是本机 OS 套接字 API (BSD-socket / winsock2),我对 linux 和 windows 平台的答案很感兴趣。

[编辑:]
如果不清楚,这里是connect docs 中的问题部分:

如果套接字 sockfd 是 SOCK_DGRAM 类型,那么 addr 是默认发送数据报的地址,也是接收数据报的唯一地址。

【问题讨论】:

  • 你不能只使用sendto和所需的目标地址而不是调用connect吗?
  • @dewaffled:当然可以,但这意味着我必须保留目标地址结构,据我所知,它的效率也较低(尽管在大多数情况下这可能并不明显)。
  • 还要注意网络错误(例如,ICMP 目标不可达)将被转发到connected UDP 套接字。这对您可能有用也可能没用,但通常服务器无法做任何事情,因为在很多情况下这些不会被发回

标签: c++ c sockets networking udp


【解决方案1】:

是否可以仅设置 UDP 套接字的默认目标 像 connect 一样,但不会失去从其他来源接收包裹的能力?

据我所知,它不是 -- connect() 在 UDP 套接字上设置默认发送目的地 并且 安装过滤器,以便从所有其他目的地传入的 UDP 数据包比指定的地址/端口被丢弃。

我对这个问题的解决方案是只调用 sendto()recvfrom() 代替(如果您的代码库中有 UDPSocket 类或类似的类,您可以将默认发送地址缓存为私有成员变量类,以便您的代码库的其余部分可以只调用 Send() 方法,并将其留给该方法来处理 sendto() 参数)

【讨论】:

    猜你喜欢
    • 2020-11-11
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    相关资源
    最近更新 更多