【发布时间】:2017-04-12 09:09:38
【问题描述】:
我正在将我的应用程序从 macOS 平台移植到 Windows 平台(这里是 Cygwin)。我遇到了网络功能 ntohll() 和 htonll() 的问题,而 ntohl()/htonl() 和 ntohs()/htons() 似乎工作正常
/* LACK OF ntohll() function definition on Cygwin */
// convert int64 from network to host representation
*int64 = ntohll(network_int64);
/* SEEMS TO WORK CORRECTLY */
// convert int32 from network to host representation
*int32 = ntohl(network_int32);
更新:这个呢?
uint64_t ntohll(uint64_t network_num64) {
uint32_t network_num32[2];
uint32_t host_num32[2];
uint64_t host_num64;
memcpy(network_num32, &network_num64, sizeof(network_num64));
host_num32[0] = ntohl(network_num32[0]);
host_num32[1] = ntohl(network_num32[1]);
memcpy(&host_num64, host_num32, sizeof(host_num64));
return host_num64;
}
和
uint64_t htonll(uint64_t host_num64) {
uint32_t host_num32[2];
uint32_t network_num32[2];
uint64_t network_num64;
memcpy(host_num32, &host_num64, sizeof(host_num64));
network_num32[0] = htonl(host_num32[0]);
network_num32[1] = htonl(host_num32[1]);
memcpy(&network_num64, network_num32, sizeof(network_num64));
return network_num64;
}
【问题讨论】:
-
提示:你可以使用
htonl两次创建htonll。 -
你能给我举个例子吗?我应该以某种方式将 uint64_t 数字拆分为 2 个 uint32_t 数字吗?
-
@JonathonReinhart:你确定吗?你怎么知道这两个结果的使用顺序?
-
是的,这两个数字的顺序有问题;/我更新了这个提示,但我认为它不能正常工作。
-
@JonathanLeffler 假设
__BYTE_ORDER__也可用。
标签: c windows unix networking cygwin