C 获取UDP套接字的随机端口
我需要创建一个程序,通过UDP套接字与同一台计算机上的其他程序通信。它将从stdin读取命令,其中一些命令将使它在不停止执行的情况下发送/接收数据包。我已经阅读了一些信息,但由于我不熟悉socket编程,需要快速完成,我有以下问题:C 获取UDP套接字的随机端口,c,sockets,C,Sockets,我需要创建一个程序,通过UDP套接字与同一台计算机上的其他程序通信。它将从stdin读取命令,其中一些命令将使它在不停止执行的情况下发送/接收数据包。我已经阅读了一些信息,但由于我不熟悉socket编程,需要快速完成,我有以下问题: 我需要获得一个随机的未使用的端口供程序监听,并将其保留,以便其他程序可以与此通信,并且该端口不被其他程序保留。我还需要将端口号存储在变量上,以备将来使用 由于通信是跨同一台机器上的进程进行的,我想知道是否可以使用pfu LOCAL 此外,还欢迎提供此类套接字设置的代
此外,还欢迎提供此类套接字设置的代码示例,以及发送/接收字符串的示例。调用
bind()
指定端口0。这将允许操作系统选择一个未使用的端口。然后,您可以使用getsockname()
检索所选端口。如果随机端口实际上很重要,您应该执行以下操作:
srand(time(NULL));
rand() % NUM_PORTS; // NUM_PORTS isn't a system #define
然后在bind中指定该端口。如果失败,请选择一个新的(无需重新为随机生成器设定种子。如果随机端口不重要,请查看Remy Lebeau的答案。如果需要临时端口,Remy Lebeau的答案很好。如果需要永久保留端口,则效果不太好,因为其他软件也使用相同的方法获取端口(包括每个连接都需要新的临时端口的OS TCP堆栈) 因此,可能会发生以下情况:
我对这个问题的解决方案是命令行实用程序。使用标准库的Linux操作系统为什么使用套接字在进程之间进行通信?这只是为了实现它吗?;)这是一个很好的方法,但肯定不是随机的方法。我想如果你想要一个真正的随机端口,你可以继续尝试绑定到它((rand()%65535)+1),直到绑定返回成功。这将是随机的,因为在绑定成功之前,您不知道选择了哪个端口。绑定到端口0允许操作系统选择第一个可用的未使用端口。如果
bind()
成功,我们保证您拥有一个只供您使用而不供他人使用的端口。您声明的要求并不要求它是真正随机的,只是唯一的,而且会是唯一的。我认为bind(…,0)返回的端口对于持久性使用来说不是很好;有关详细信息,请参阅我的答案。您必须跟踪尝试的端口,这样您就不会尝试再次绑定到它们,因为它们第一次失败。是的,尽管在找到打开的端口之前以伪随机序列重复端口的可能性非常低。很少(如果有的话)会使用ll您需要第一次检索临时端口,并将其保存起来,以便在后续连接中重复使用。我已经编写套接字代码10多年了,从来没有这样做过,一次也没有。通常,您要么每次都使用临时端口(对于服务器,提供一种动态发现该端口的方法),或让用户在应用程序的配置中指定一个固定端口,在这种情况下,用户确保该端口始终可用。如果我对问题的理解正确(特别是“1”部分),它要求这样做。但情况可能并非如此。用例不是让用户确保端口始终可用,而是让软件确保端口可用。