【问题标题】:Client UDP Socket binding客户端 UDP 套接字绑定
【发布时间】:2011-03-16 04:57:24
【问题描述】:

我正在为 UDP 客户端创建 UDP 套接字并发送具有不同端口号的 UDP 数据包,并等待来自目的地的回复一段时间。

我的疑问是.. 是否可以在不关闭套接字的情况下将 UDP 套接字重新绑定到多个端口号(甚至 IP 地址)到同一个套接字 FD? (我不能使用 RAW 套接字 :()

EDIT1:我尝试将两个不同的套接字文件描述符绑定到相同的 IP 地址和端口号,但结果好坏参半..(对于两个套接字文件描述符,我都设置了 SO_REUSEADDR 选项)。

在 Linux 内核 2.6.8 中

第一个 Socket FD - 绑定成功。

第二个套接字 FD:返回错误 98,说明地址已在使用中。

在 Linux 内核 2.6.24 中

First Socket FD:绑定成功

第二个Socket FD:绑定成功

【问题讨论】:

    标签: linux sockets udp udpclient


    【解决方案1】:

    尝试在一组打开的套接字上使用select()

    【讨论】:

    • 嗯 select() 只能用于打开的多个套接字,但不能用于单个 SOCKET FD :(
    • @codingfreak:每个监听套接字都需要自己的 FD。为您侦听的每个端口/地址对打开一个套接字。然后select循环查找下一个要读取的。
    • @codingfreak:只在一个socket fd上使用select()是完全可以的。
    【解决方案2】:

    我的疑问是.. 是否可以在不关闭套接字的情况下将 UDP 套接字重新绑定到多个端口号(甚至 IP 地址)到同一个套接字 FD??

    看来POSIX has that now officially as unsupported,引用:bind() 函数应将本地套接字地址分配给由描述符套接字标识的套接字没有分配本地套接字地址

    过去我听说在某些平台上可以进行 re-bind(),但我个人从未使用过。

    除了这个还有什么最好的解决办法???

    保留打开的 UDP 套接字的缓存,使用带有 poll() 的套接字进行 IO 多路复用和超时处理。

    【讨论】:

      【解决方案3】:

      要实现这一点,您可以使用一个 UDP 套接字绑定到一个端口来接收数据,而另一个(绑定到不同的端口)进行发送。

      【讨论】:

      • 这对我来说不是一个好的解决方案..因为我必须在同一个套接字上发送和接收数据......看来 select() 真的会帮助我。
      猜你喜欢
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 2018-05-23
      • 2018-09-08
      • 2023-03-09
      • 2014-11-19
      • 2018-02-04
      • 1970-01-01
      相关资源
      最近更新 更多