使用winsock vc++通过UDP发送数字数组
Sending numeric Array via UDP using winsock vc++
已解决:问题主要是与simulink块集读取UDP数据包而不是数据传输有关。
我试图通过使用winsock从c++程序发送一个20字节的数值数组。我遇到的问题是数据包装,最后我希望数组中的每个数字都作为自己的字节出去,以便我的simulink模型接收这些值不需要额外的处理脚本。
我的数组包含14个布尔值(0|1)和6个范围从-100到100的值。这些是报告控制器输入的状态。例如,数组看起来像
int array msgint[20] = [1,0,1,0,0,1,1,0,0,0,0,0,0,0,50,80,-90,40,90,-20];
我尝试过使用类型转换和发送多个字符串,但所有这些都只是重新排列我得到的乱码或导致套接字错误。目前我的sendto函数看起来像
sendto(sd,message,80,0,(struct sockadd *) &server,server_length)
我知道这行可以工作,因为数据包使它通过,它只是没有像我希望的那样出现。在发送到,消息是格式化字符串我试图创建正确发送数组的所有内容。目前它是任意的,没有什么意义,我把它主要用于调试目的。
你开始错了。网络通信应从有线协议的设计开始。
你将如何表示电线上的东西。二进制或文本。大多数"现代"协议使用文本(json或xml)。几年前二进制很流行(asn1/ber/der)。我建议json
那么你将如何包装有效载荷?你需要说"here is a set of xxx"吗?这是一组yyyys。我不知道你在做什么,所以很难说你需要什么
如果你想发送20个字节,并且你知道数组中的每个整数值都在[-100,+100]范围内,你不应该使用int
类型,在现代平台上通常包含32位或64位值。
您可能希望使用char
类型,它通常表示8位值。
更确切地说,如果你可以使用c++ 11的特性,你应该使用<cstdint>
头,它定义了int8_t
类型,保证是一个有符号的8位类型。参见http://en.cppreference.com/w/cpp/types/integer。
你的数组应该看起来像:
#include <cstdint>
std::int8_t msgint[20] = {1,0,1,0,0,1,1,0,0,0,0,0,0,0,50,80,-90,40,90,-20};
或
char msgint[20] = {1,0,1,0,0,1,1,0,0,0,0,0,0,0,50,80,-90,40,90,-20};
,你的sendto将是:
sendto(sd,msgint,20,0,(struct sockadd *) &server,server_length);
"最后我想让数组中的每个数字都作为自己的字节出去"
然后将数组更改为
char msgint[20] = ...
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 如何计算数组中元素的位数?(不是数组的长度),并计算其数字的总和
- 数组/c++中的大量数字
- 遍历并行数组以确定C++中的最大数字
- 整数区间(或 int 数组)中每个数字的出现次数
- 如何在 C++ 中将文件中的逗号分隔数字读取到数组中?
- 将随机生成的数字添加到数组 + 对这些数组求平均值
- 遇到此问题时遇到困难:允许用户输入数组的值并使用 for,而循环也输出输入的最大数字
- 获取 2D 数组 c++ 中的所有数字对
- 为什么使用数组元素查找最大数字的程序不起作用?
- 如何从向量或数组中选择最常见的数字?(前五名)C++
- 如何从保存在 Java 中C++的字节数组中读取数字?
- 以十为基数的数字到布尔数组,该数组要求二进制/基数为 2 的数字
- C++ 检查结果数组中有多少次数字
- 如何在不使用 C++ 中的数组或函数的情况下查找 N 位数字的所有排列
- 如何在C++中有效地将数字值重新分配给字符数组
- 查找数组中的最小数字
- 查找数组中重复(重复)数字的索引
- 我必须找到给定数组中所有数字的周期,就像有很多解决方案,但数组的大小是 10^5
- 类、数字/数组或对象中的对象