已解决:问题主要在于读取UDP数据包而不是数据传输的simulink模块集。
我试图通过使用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)
我知道这条线可以正常工作,因为它不会像我希望的那样出现。在发送到,消息是我试图创建的格式化字符串,以正确发送数组的所有内容。目前是任意的,没有什么意义我将其用于调试目的。
答案 0 :(得分:1)
你是从错误的角度出发的。网络通信应从有线协议的设计开始。
你将如何代表电线上的东西。二进制或文本。大多数'现代'协议使用文本(json或xml)。几年前二元是热的(asn1 / ber / der)。我建议json
然后你将如何包装有效载荷。你需要说'这是一组xxxs。现在这里有一套yyyys'。我不知道你在做什么所以很难说你需要什么
答案 1 :(得分:0)
如果要发送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);
答案 2 :(得分:0)
“最后我希望数组中的每个数字都作为自己的字节”
然后将数组更改为
char msgint[20] = ...