连接UDP套接字,但仍然接收来自其他源的数据报

Connect a UDP socket, but still receive datagrams from other sources

本文关键字:其他 数据报 套接字 UDP 连接      更新时间:2023-10-16

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

我谈论的是本机操作系统套接字API(BSD-socket/winsock2(,我对linux和windows平台的答案很感兴趣。

[编辑:]
如果不清楚,下面是连接文档中有问题的部分:

如果套接字sockfd的类型为SOCK_DGRAM,则addr是默认情况下发送数据报的地址,也是接收数据报的唯一地址。

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

据我所知,它不是——UDP套接字上的connect()都设置了默认发送目的地,并且安装了一个筛选器,以便丢弃来自指定地址/端口以外的所有其他目的地的传入UDP数据包。

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