从C++客户端我发送一个6字节的缓冲区到C#服务器。如何正确地将C++ ulong 4字节的IP地址转换为C#类型?
ULONG addr = htonl(server->sin_addr.s_addr);
USHORT port = server->sin_port; -> Already reversed to network bytes.
char frame[sizeof(USHORT) + sizeof(ULONG)];
memcpy(frame, &port, sizeof(USHORT));
memcpy(&frame[2], &addr, sizeof(ULONG));
int result = send(s, (const char*)frame, sizeof(frame), 0);
正如你可以看到,缓冲液包含:[2字节端口,4个字节的地址]
在C#服务器侧,林然后从网络到主机字节转换端口和地址。我已经检查确认并且接收的缓冲区总是6个字节。
ushort port = BitConverter.ToUInt16(buffer, 0);
byte[] temp = new byte[4];
Array.Copy(buffer, 2, temp, 0, temp.Length);
uint address = BitConverter.ToUInt32(temp, 0);
long addressx = IPAddress.NetworkToHostOrder(address);
destPort = (ushort)IPAddress.NetworkToHostOrder((short)port);
destAddress = (new IPAddress(addressx).ToString());
有时候,初始化new IPAddress(address)
,ArgumentOutOfRangeException时,我得到一个例外。
我不明白为什么它只是偶尔发生,我做错了什么?
为什么在IP地址上使用'htonl'和'NetworkToHostOrder'(我知道这是可移植的方式,如果你想支持小型和大型端节点)而不是端口? – Jonas
当IPv4地址恰好是32位时,为什么'addressx'定义为'long'(64位?)? – Jonas
@Jonas我试着把它定义为int,问题是一样的:/我写道端口已经被颠倒了。 –