在 UDP 套接字上多次调用 connect() 以发送到不同的目标地址 - 有效吗?

Posted

技术标签:

【中文标题】在 UDP 套接字上多次调用 connect() 以发送到不同的目标地址 - 有效吗?【英文标题】:Calling connect() multiple times on UDP socket to send to different target address - valid? 【发布时间】:2016-11-30 12:32:17 【问题描述】:

我正在研究 UDP 通信协议的实现。

我有一个关于 UDP 的 connect() 调用的问题。

我想使用 connect() 和 send() 而不是 sendto()。通常接收端不会改变。但是,在某些情况下,它可能会。 在已经连接的 UDP 套接字上调用 connect() 以设置不同的目标而不关闭和重新打开套接字(以及丢失缓冲的接收数据报)是否有效?

我没有找到任何有效或无效的文档(因此,测试可能只会告诉我它是否能正常工作,这可能是不可移植的)。我目前在 Windows 7 上使用 winsock2,但希望能够移植到其他(较新的)Windows 版本和 linux。

【问题讨论】:

【参考方案1】:

至少对于 Linux,联机帮助页(man 2 connect)说 OK: ' 一般情况下,基于连接的协议套接字只能成功connect()一次;无连接协议套接字可以多次使用 connect() 来更改它们的关联。无连接套接字可能会解散关联 通过连接到一个地址,将 sockaddr 的 sa_family 成员设置为 AF_UNSPEC(自内核 2.2 起在 Linux 上受支持)。 '

【讨论】:

谢谢。现在我只需要了解有关 Windows 的信息 :-) 或者只是尝试它是否有效并希望行为不会改变。 实际上,我找到了适用于 Windows 的答案,尽管听起来它的实现类似于关闭/重新打开套接字:'对于无连接套接字(例如,键入 SOCK_DGRAM),[...]。即使套接字已经连接,也可以通过再次调用 connect 来更改默认目标。如果名称与先前的连接不同,则任何排队等待接收的数据报都将被丢弃。'

以上是关于在 UDP 套接字上多次调用 connect() 以发送到不同的目标地址 - 有效吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 UDP 套接字上使用 sendto()/recvfrom() 而不是 connect()/send()/recv() 的目的是啥?

GCDAsyncUdpSocket,“不能多次绑定套接字”

14. “已连接”的UDP是不是存在?

我可以在同一个套接字描述符上调用 bind() 然后 connect() 吗?

TCP和UDP的区别

在 UDP 套接字上使用 write()/read()?