通过TCP/IP以太网发送数字数据

Send numerical data via TCP/IP ethernet

本文关键字:数字 数据 以太网 TCP IP 通过      更新时间:2023-10-16

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

我正在使用WinSocket API,并且正在发送数据(尽管我不确定这是否正确或有效!(:

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

基本上这是正确的吗?在不使用UDP的情况下,通过TCP浮动的最佳方式是什么。我想解码本质上是对用于将浮点值发送为char*的方法进行反向工程。

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

主机Windows7(可能使用了htonf,但我使用的是x86,所以没有endian问题(:

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: %dn", WSAGetLastError());
    closesocket(connection);
    WSACleanup();
    return -1;
    }
    printf("Bytes Sent: %ldn", iResult);
    return 1;
};

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

void parse_input(char* input){
    xil_printf("Input : ");
    xil_printf(input);
    xil_printf("nr");
u32 d = *(u32*)input;
union v{
    float f;
    u32 u;
};
union v val;
val.u = d;
printf("Value u32 = %i nr",val.u);
printf("Value float = %f nr",val.f);
}

无论您发送的是浮点还是字符串。您以字节数组的形式发送数据,然后在另一端接收数据,并根据需要对其进行解释。因此,在您的情况下,您应该发送一个4字节长的浮点值。您应该将4个字节作为字节数组发送,并在另一端将其转换为浮点并使用它

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

在接收器部分:

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

使用UDP更容易,因为您不必检查连接和发送数据的成功与否。您只需在不连接到服务器的情况下发送它。

这不是TCP与UDP的问题。

首先,要发送单个浮点值,您不需要将其重新解释为地址,而是使用浮点的地址

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

但只有当通信的两端都有相同的体系结构时,这才有效。

为了使其独立于体系结构问题,您必须使用一些外部数据表示来从一个系统传输到另一个系统。或者,您也可以使用基于文本的协议,并将浮点值转换为字符串。

这是不正确的。顾名思义,strlen代表字符串。您需要将缓冲区的实际大小传递给send