C ++套接字编程 - 查找客户端计算机IP,TrueIP和绑定端口

时间:2014-04-02 23:52:02

标签: c++ sockets networking udp

我在确定如何填写自定义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&#39 ;

  2. 如何获取客户端计算机的IP地址," true" IP地址?

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

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

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

1 个答案:

答案 0 :(得分:1)

    致电bind()后,
  1. ,您可以使用getsockname()查找bind()选择的端口。

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

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