Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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

  • 此外,还欢迎提供此类套接字设置的代码示例,以及发送/接收字符串的示例。

    调用
    bind()
    指定端口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)中以备将来使用
  • 需要此端口的软件启动并绑定该端口
  • 然后,您需要重新启动软件,例如:

  • 软件停止并解除绑定端口:现在可以通过bind(0)和getsockname()再次返回端口
  • e、 g.TCP堆栈需要一个端口并绑定您的端口
  • 软件无法启动,因为端口已绑定
  • 因此,对于“未来使用”,您需要一个不在临时端口范围内的端口(即bind(host,0)返回端口的范围)


    我对这个问题的解决方案是命令行实用程序。

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