gpt4 book ai didi

C++ 套接字编程 - 查找客户端机器 IP、TrueIP 和绑定(bind)端口

转载 作者:行者123 更新时间:2023-11-28 06:58:41 25 4
gpt4 key购买 nike

我在弄清楚如何填写自定义 UDP header 时遇到了一些问题。客户端通常连接到参数中指定的服务器/端口,并且可选地它还接受中继 IP 和端口号,然后中继使用 header 中的信息转发到服务器。目前,如果提供原始 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

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

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. 我知道如果为 clientport 提供 0 它将选择任何端口(绑定(bind)时默认情况下会发生这种情况),我如何确定选择了哪个端口并将其包含为“from_port”?

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

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

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

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

最佳答案

  1. 调用bind()后,可以使用getsockname()找出bind()选择的端口.

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

  3. 使用 getaddrinfo(),或者使用特定于平台的 API,例如 WSAStringToAddress()RtlIpv(4/6 )StringToAddress() 在 Windows 上。

关于C++ 套接字编程 - 查找客户端机器 IP、TrueIP 和绑定(bind)端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22825283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com