Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 获取UDP套接字的随机端口_C_Sockets - Fatal编程技术网

C 获取UDP套接字的随机端口

C 获取UDP套接字的随机端口,c,sockets,C,Sockets,我需要创建一个程序,通过UDP套接字与同一台计算机上的其他程序通信。它将从stdin读取命令,其中一些命令将使它在不停止执行的情况下发送/接收数据包。我已经阅读了一些信息,但由于我不熟悉socket编程,需要快速完成,我有以下问题: 我需要获得一个随机的未使用的端口供程序监听,并将其保留,以便其他程序可以与此通信,并且该端口不被其他程序保留。我还需要将端口号存储在变量上,以备将来使用。 由于通信是跨同一台机器上的进程进行的,我想知道是否可以使用pfu LOCAL。 此外,还欢迎提供此类套接字设置

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

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

调用绑定指定端口0。这将允许操作系统选择一个未使用的端口。然后,您可以使用getsockname检索所选端口。

如果随机端口确实很重要,您应该执行以下操作:

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

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

如果您需要临时端口,Remy Lebeau的答案很好。如果您需要一个持久保留端口,这就不太好了,因为其他软件也使用相同的方法来获取一个端口,包括OS TCP堆栈,该堆栈需要为每个连接提供一个新的临时端口

因此,可能会发生以下情况:

使用0和getsockname调用bind以获取端口; 然后将其保存到config或多个config中以备将来使用; 需要此端口的软件启动并绑定该端口。 然后,您需要重新启动软件,例如:

软件停止并解除绑定端口:现在可以通过bind0和getsockname再次返回端口; e、 g.TCP堆栈需要一个端口并绑定您的端口; 软件无法启动,因为端口已绑定。 因此,对于将来的使用,您需要一个不在临时端口范围内的端口,该范围是bindhost 0返回端口的范围


我的解决方案是使用命令行实用程序

使用标准库的Linux操作系统为什么使用套接字在进程之间进行通信?只是为了做这件事吗;这是一个很好的方法,但肯定不是随机的方法。我想如果你想要一个真正的随机端口,你可以一直尝试绑定到rand%65535+1,直到绑定返回成功。这将是随机的,因为在绑定成功之前你不知道选择了什么端口。绑定到端口0允许操作系统选择第一个可用的未使用端口。如果绑定成功,则保证您拥有一个仅由您而非其他人使用的端口。您声明的要求并不要求它是真正随机的,只是唯一的,而且它将是唯一的。我认为bind返回的端口..,0对于持久使用来说不是很好;有关详细信息,请参阅我的答案。您必须跟踪尝试的端口,以便在它们第一次失败后不再尝试绑定它们。没错,尽管在找到打开的端口之前以伪随机序列重复端口的可能性非常低。非常少,如果有的话,您是否需要第一次检索临时端口,并将其保存以供后续连接中重复使用。我已经写套接字代码超过10年了,从来没有必要这么做,一次也没有。通常情况下,您可以在每次和服务器上使用临时端口,提供一种动态发现该端口的方法,或者让用户在应用程序的配置中指定一个固定端口,在这种情况下,用户确保该端口始终可用。如果我对问题的理解是正确的,特别是第1部分,它会要求这样做。但情况可能并非如此。用例不是让用户确保端口始终可用,而是让软件确保端口可用。