gpt4 book ai didi

c++ - 通过 TCP/IP 以太网发送数值数据

转载 作者:行者123 更新时间:2023-11-30 17:34:22 25 4
gpt4 key购买 nike

所以我知道你们中的许多人会建议不要这样做,但我想通过 TCP/IP 将 float 发送到在 SoC 上运行的 TCP 服务器(Zynq7020,服务器位于 Arm A9 上)。在继续使用 UDP 之前,我希望将其作为一个简单的概念证明,UDP 可能更适合发送原始数据。我在客户端将 float 转换为字符数组并在服务器上再次转换时遇到问题。虽然我不确定这是最好的方法。

我正在使用 WinSocket API,并按如下方式发送数据(尽管我不确定这是否正确或有效!):

char * sendbuf;
sendbuf = reinterpret_cast<char *>(f);
iResult = send(ConnectSocket, sendbuf, (int) strlen(sendbuf), 0);

基本上这是正确的,并且在不使用 UDP 的情况下,通过 TCP float 的最佳方式是什么。我猜解码本质上是对用于将浮点作为 char* 发送的方法进行逆向工程。

---下面是通过 WinSock 向 Zynq ARM cpu LwIP 发送 float 的完整工作示例 --

主机 Windows 7(可能使用了 htonf,但我使用的是 x86,因此不存在字节序问题):

int FPGA_Accelerator::sendFloat(float* f) {
char *sendbuf;
int iResult;
char arr[4];

*(float*)arr= *f;

printf("Sending "); printf(arr); printf("\n");
iResult = send(connection, arr, (int) sizeof(arr), 0);
if (iResult == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
closesocket(connection);
WSACleanup();
return -1;
}

printf("Bytes Sent: %ld\n", iResult);

return 1;
};

Zynq 代码。在recv_callback中我调用函数parse_input(p->payload)

void parse_input(char* input){
xil_printf("Input : ");
xil_printf(input);
xil_printf("\n\r");

u32 d = *(u32*)input;
union v{
float f;
u32 u;
};
union v val;
val.u = d;

printf("Value u32 = %i \n\r",val.u);
printf("Value float = %f \n\r",val.f);

}

最佳答案

发送的是 float 还是字符串并不重要。您以字节数组的形式发送数据,并在另一端接收它们并按照您的意愿解释它们。因此,在您的情况下,您应该发送一个 4 字节长的 float 。您应该将 4 个字节作为字节数组发送,并在另一端将其转换为 float 并使用它。

iResult = send(ConnectSocket, (char*)&f, (int) sizeof(float), 0);

在接收器部分:

char *receivebuf;
// read data from socket
float *receivedFloat = (float*)receivebuf;

使用 UDP 更容易,因为您不必检查连接和发送数据是否成功。您只需发送它而无需连接到服务器。

关于c++ - 通过 TCP/IP 以太网发送数值数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23375901/

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