获取UDP套接字的随机端口

时间:2012-01-12 21:15:23

标签: c sockets

我需要创建一个程序,通过UDP套接字与同一台计算机上的其他程序进行通信。它将从stdin读取命令,其中一些命令将使其在不停止执行的情况下发送/接收数据包。我已经阅读了一些信息,但由于我不熟悉套接字编程并需要快速完成,我有以下问题:

  1. 我需要获取一个随机的未使用端口供程序监听,并保留它以便其他程序可以与此通信,并且该端口不会被其他程序保留。我还需要将端口号存储在变量上以备将来使用。
  2. 由于通讯是在同一台机器上的进程之间,我想知道我是否可以使用PF_LOCAL。
  3. 此外,欢迎使用此类套接字设置的代码示例,以及发送/接收字符串的示例。

3 个答案:

答案 0 :(得分:20)

调用bind()指定端口0.这将允许操作系统选择未使用的端口。然后,您可以使用getsockname()来检索所选端口。

答案 1 :(得分:1)

如果您需要临时端口,Remy Lebeau的回答很好。如果您需要持久保留端口则不太好,因为其他软件也使用相同的方法来获取端口(包括需要为每个连接建立新临时端口的OS TCP堆栈)。

所以可能会发生以下情况:

  1. 使用0和getsockname()调用bind来获取端口;
  2. 然后将其保存到配置(或几个配置)以供将来使用;
  3. 需要此端口的软件启动并绑定端口。
  4. 然后你需要例如重启软件:

    1. 软件停止并取消绑定端口:现在可以通过bind(0)和getsockname()再次返回端口;
    2. e.g。 TCP堆栈需要一个端口并绑定您的端口;
    3. 软件无法启动,因为端口已绑定。
    4. 因此,对于“将来使用”,您需要一个不在临时端口范围内的端口(这是bind(host,0)返回端口的范围)。

      我对此问题的解决方案是port-for命令行实用程序。

答案 2 :(得分:0)

如果它是一个随机端口实际上很重要,你应该做类似的事情:

srand(time(NULL));
rand() % NUM_PORTS; // NUM_PORTS isn't a system #define

然后在bind中指定该端口。如果失败,请选择一个新的(不需要重新播种随机生成器。如果随机端口不重要,请查看Remy Lebeau的答案。