如何将C++ ulong 4 字节 IP 地址正确转换为 C# 类型
How to correctly convert C++ ulong 4 bytes IP address to C# type?
从
C++客户端,我正在向C#服务器发送6个字节的缓冲区。
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# 服务器端,Im 然后将端口和地址从网络转换为主机字节。我已经检查以确保收到的缓冲区始终为 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。
我不明白的是,为什么它只是偶尔发生,我做错了什么?
这里的问题是您的addressx
要么小于零,要么大于 0x00000000FFFFFFFF。
发生这种情况是因为您在address
是uint
时调用IPAddress.NetworkToHostOrder(address);
。由于没有接受uint
的NetworkToHostOrder()
的重载,这是将参数提升到long
并调用NetworkToHostOrder(long)
。这会导致某些输入为负值。
您需要做的是使用地址的int
形式调用采用 int 的版本:
int address = BitConverter.ToInt32(temp, 0);
现在,当您调用NetworkToHostOrder()
时,您将获得一个(可能是负面的(int
,您需要将其投射到uint
:
uint addressx = (uint) IPAddress.NetworkToHostOrder(address);
现在这应该可以工作了:
destAddress = (new IPAddress(addressx).ToString());
相关文章:
- 无法转换类型 C++
- 包含可变参数包的第一个可转换类型的别名的结构
- 将 std::conditional 与不可转换类型(原始与指针)一起使用
- 链接方法时出现转换类型错误
- 如何避免隐式转换类型
- 在多重继承场景中动态强制转换类型
- 编译器不支持的转换类型
- 错误调用功能无法转换类型
- 我想看到一个在整个后缀表达式的上下文中查找转换类型 id 的示例
- 对于动态类型为强制转换类型的对象,dynamic_cast失败
- 无法在初始化中转换类型
- 如何让"auto"转换类型
- 如何通过强制转换类型指针将字符数组转换为uint16_t
- 如何从新运算符+(Template类)返回具有转换类型的对象
- 带有模板的基于枚举的工厂无法转换类型
- 使用SWIG类型映射通过字符串转换类型
- 对于可转换类型,设计比循环依赖项更好
- SWIG不能正确转换类型定义
- 将类型转换扩展到可转换类型的对/元组
- 想要将字符数组的部分转换/类型转换为值