我在确定如何填写自定义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&#39 ;
如何获取客户端计算机的IP地址," true" IP地址?
如何检测主机名是否用作参数而不是IP地址,以及如何对其进行编码以使其中任何一个都有效?现在我正在使用类似的东西:
inet_aton(servername OR relay,& server.sin_addr);
为服务器/中继的sockaddr_in填写sin_addr,只有在提供IP地址时才有效。
答案 0 :(得分:1)
bind()
后,,您可以使用getsockname()
查找bind()
选择的端口。
一台机器可以安装多个IP,因此要获得“真正的”IP,您需要知道哪个特定的NIC /适配器用于与中继通信,然后您可以检索该NIC /适配器IP。套接字API中没有任何内容可用于获取该IP,您需要使用特定于平台的API,例如Windows上的GetAdaptersInfo()
/ GetAdapterAddresses()
或其他平台上的getifaddrs()
。一旦确定了特定的NIC /适配器,就可以bind()
到该IP的客户端套接字。
使用getaddrinfo()
,或者只使用特定于平台的API自行解析字符串,例如Windows上的WSAStringToAddress()
或RtlIpv(4/6)StringToAddress()
。