【发布时间】: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
我知道如果为客户端端口提供 0,它将选择任何端口(绑定时默认情况下会发生这种情况),我如何才能确定选择了哪个端口并将其包含为 'from_port'?
如何获取客户端计算机的 IP 地址和“真实”IP 地址?
-
如何检测主机名是否用作参数而不是 IP 地址,以及如何对其进行编码以便两者都可以使用?现在我正在使用类似的东西:
inet_aton(servername OR relay, &server.sin_addr);
为服务器/中继的 sockaddr_in 填写 sin_addr,仅在提供 IP 地址时才有效。
【问题讨论】:
标签: c++ sockets networking udp