gpt4 book ai didi

c# - 如何正确地将 C++ ulong 4 字节 IP 地址转换为 C# 类型?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:09:39 26 4
gpt4 key购买 nike

我从 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# 服务器端,我将端口和地址从网络字节转换为主机字节。我已经检查以确保接收到的缓冲区始终为 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。

发生这种情况是因为当 addressuint 时,您正在调用 IPAddress.NetworkToHostOrder(address);。由于没有接受 uintNetworkToHostOrder() 重载,这会将参数提升为 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# - 如何正确地将 C++ ulong 4 字节 IP 地址转换为 C# 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43865599/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com