【发布时间】:2021-12-20 05:46:37
【问题描述】:
我有一个客户端,它在[0..10] 范围内生成一个随机浮点数。该客户端通过套接字将浮点值发送到服务器,服务器必须显示它。我一直在试图弄清楚如何通过套接字正确发送浮点数,但我无处可去。我设法直接发送值,但我想做的是将浮点数转换为网络表示并返回,所以我想使用函数 htonl() 和 ntohl() 但我一直没有这样做。我不想在这里复制整个服务器/客户端代码,因为它相当多,所以我对发生的情况进行了一个小模拟,这会产生与服务器/客户端代码相同的问题。
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char* argv[]) {
uint32_t tmp, data;
srand(time(NULL));
float rand_float = ((float)rand() / (float)RAND_MAX) * 10;
printf("Generated random float = %f\n", rand_float);
// client converts to network representation(big endian) and sends the data
memcpy(&tmp, &rand_float, sizeof(tmp));
tmp = htonl(tmp);
// simulate sending the data over the network
memcpy(&data, &tmp, sizeof(data));
// server receives the data and has to convert it to host representation (little endian in my case)
float res = (float) ntohl(data);
printf("After send: %f\n", res);
return 0;
}
这与我在服务器/客户端案例中想要的非常相似。如您所见,客户端将随机浮点数据复制到uint32_t 变量中,将其转换为网络表示并发送。服务器在uint32_t 类型的变量data 中接收该数据,将其转换为主机表示,并将该值转换为浮点数。我希望这行得通。但是当我运行它时,我会得到类似的东西:
Generated random float = 9.266754
After send: 1091847296.000000
或类似的东西。显然它不起作用。确切的行为发生在我的服务器/客户端代码中,我得到类似的输出。同样,在服务器/客户端代码中,每当我从网络表示中删除该转换并在我的机器上运行服务器和客户端代码时,一切都按预期工作,所以我很确定问题出在这个转换的某个地方,但我没有看不出上面的代码有什么问题。我在这里阅读了其他关于这种类型转换的问题(这就是我发现这种发送浮点数的方法的地方),但它们并没有解决我的问题。
【问题讨论】:
标签: c sockets floating-point network-programming