通过TCP/IP以太网发送数字数据
Send numerical data via TCP/IP ethernet
所以我知道你们中的许多人会建议不要这样做,但我想通过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
。
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 使用 std::locale 格式化法语数字时无效的 UTF-8 数据
- 用于筛子的最佳数据结构是什么(即一些被划掉的数字列表)?
- 尝试使用 ifstream 读取数据后显示不正确的数字
- C++,打开和编辑文本文件中的数字数据,并将结果放入新文件中
- 从文件中读取带有空格和数字数据的文本
- 创建一个带有限制的数字数据类型,一个介于 -10 和 10 之间的整数
- 将映射的每个键中的数字数据与另一个数值进行比较
- 为具有一个数字数据成员的类定义所有比较运算符的方便方法
- (c++)从txt文件中读取列中的数字数据并确定最高值
- 如何在不使用 atof 函数的情况下将命令行添加为数字数据
- 如何解析来自 EDID 的数字数据
- 从C++文件中读取不同类型的数字数据
- 如何强制流根据类型写入数字数据
- 为什么我将数字数据从文本文件导入二维数组的代码不起作用
- 用C++读取表格中的数字数据,代码行数最少
- C++中的数字数据验证
- 如何将数字数据序列化为char*
- 将数字数据以二进制形式写入文件,而不是写出
- 通过TCP/IP以太网发送数字数据