【问题标题】:C++ Socket Programming- Finding client machines IP, TrueIP, and bind portC++ Socket Programming - 查找客户端机器 IP、TrueIP 和绑定端口
【发布时间】:2014-04-02 23:52:01
【问题描述】:

我在弄清楚如何填写自定义 UDP 标头时遇到了一些麻烦。客户端通常连接到参数中指定的服务器/端口,并且可选地它还接受中继 IP 和端口号,然后中继使用标头中的信息转发到服务器。目前,如果提供原始 IP 地址(即 127.0.0.1),该程序可以工作,但是我无法让继电器正常工作。

我使用以下参数:

    clientport=atoi(argv[5]); //port on current machine to bind (default 0)
    relayport=atoi(argv[4]);  //port on relay to connect to
    relay = argv[3];          //relay IP
    port = atoi(argv[2]);     //server port
    servername = argv[1];     //server IP

我需要在中继的标头中填写以下内容(按网络字节顺序):

uint32_t from_IP, to_IP;  // Ultimate destination, not the relay
uint32_t trueFromIP, trueToIP; // AWS may change public IP vs private IP
uint16_t from_Port, to_Port; // Ultimate source & destination, Not relay
  1. 我知道如果为客户端端口提供 0,它将选择任何端口(绑定时默认情况下会发生这种情况),我如何才能确定选择了哪个端口并将其包含为 'from_port'?

  2. 如何获取客户端计算机的 IP 地址和“真实”IP 地址?

  3. 如何检测主机名是否用作参数而不是 IP 地址,以及如何对其进行编码以便两者都可以使用?现在我正在使用类似的东西:

    inet_aton(servername OR relay, &server.sin_addr);

为服务器/中继的 sockaddr_in 填写 sin_addr,仅在提供 IP 地址时才有效。

【问题讨论】:

    标签: c++ sockets networking udp


    【解决方案1】:
    1. 调用bind()后,可以使用getsockname()查找bind()选择的端口。

    2. 一台机器可以安装多个 IP,因此要获得“真实”IP,您需要知道哪个特定的 NIC/Adapter 用于与中继通信,然后您可以检索该 NIC/Adapter 的知识产权。套接字 API 中没有用于获取该 IP 的任何内容,您需要使用特定于平台的 API,例如 Windows 上的 GetAdaptersInfo()/GetAdapterAddresses() 或其他平台上的 getifaddrs()。一旦确定了特定的 NIC/适配器,您就可以 bind() 到该 IP 的客户端套接字。

    3. 使用getaddrinfo(),或仅使用特定于平台的API(如Windows 上的WSAStringToAddress()RtlIpv(4/6)StringToAddress())自行解析字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多