【问题标题】:C++/Java Sockets automatic Port allocationC++/Java Sockets 自动端口分配
【发布时间】:2011-10-30 11:41:23
【问题描述】:

我有一个服务器 (Java) 和一些客户端 (c++),通过套接字连接。 我想自动设置端口。 假设 IP 已知。

在Java方面我可以做:

ServerSocket s = new ServerSocket(0);

所以现在我在服务器上有一个随机的空闲端口。

在C++端怎么知道服务器在监听哪个端口?

【问题讨论】:

  • 无法知道服务器的端口号,该怎么办呢?您可以尝试让客户端扫描服务器端口,但这有什么好处呢?

标签: java c++ sockets port


【解决方案1】:

我认为不可能,如果你想与服务器建立连接,你必须知道服务器在哪个端口监听,有像nmap这样的程序可以显示服务器中打开的端口列表,但是服务器可以同时打开多个端口然后,你怎么知道你的服务器打开的端口是什么?并且在任何情况下,调用外部工具、读取和解析其输出都太慢且效率低下。为什么需要随机端口服务?

其他选项可以是获取服务器端打开的套接字调用s.getLocalPort()并通过UDP将其发送给网络中具有广播的任何侦听节点,并重新编程客户端以侦听广播以及何时接收一条消息,检查它是否是一个端口号并使用该端口连接到服务器。

【讨论】:

  • 广播是一种选择,但请记住,广播(通常)不会由路由器跨 LAN 边界转发,因此只有在所有客户端都在同一个 LAN 网段上时才会起作用。
  • @Joan Lledó 我不想在 c++ 客户端中对端口进行硬编码,因为我不知道我将拥有多少个。我可能想随时联系更多人。
  • @pap 他们实际上在同一台计算机上。我该如何做到这一点。
  • @IsocketThis - 你知道不止一个客户端可以连接到同一个端口,对吧?您不必在服务器上为每个客户端设置单独的侦听端口。而且,如果您正在向服务器动态添加更多侦听端口(很难理解为什么不知道您的应用程序做了什么),只需让客户端连接到一个硬编码端口,响应所有其他活动端口并让客户端采取适当的措施。请参阅我关于“定位器”服务的回答。您将需要广播或定位器服务的固定已知端口。这些是可用的选项。
  • 硬编码或配置为固定值,客户端连接的服务器端口不会阻止您拥有任意数量的客户端。
【解决方案2】:

你不能,不可靠。在 IP 中,机器由地址标识。服务器(即服务)由地址和端口标识。您的客户需要某种形式的“已知服务”,他们可以连接到。

如果您出于某种原因绝对想要拥有动态侦听端口,您可以将其与已知端口上的“定位器”服务结合使用。例如,在标准 http 端口 (80) 上有一个 Web 服务/servlet。您的客户端连接到“定位器”服务(始终在端口 80 上)并询问您的应用程序当前正在侦听的端口。这并非完全不常见的模式。 RMI 的工作方式与您在已知端口上拥有注册表的方式类似。客户端连接到注册表并询问 RMI 端点的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-03
    • 2015-10-13
    • 1970-01-01
    • 2020-03-27
    • 2021-02-07
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    相关资源
    最近更新 更多