C++ 使用winsock vc+;通过UDP发送数字数组+;

C++ 使用winsock vc+;通过UDP发送数字数组+;,c++,arrays,sockets,visual-c++,udp,C++,Arrays,Sockets,Visual C++,Udp,已解决:问题主要是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

已解决:问题主要是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)

我知道这条线的工作,因为包通过它只是没有出现,因为我想它。在send to中,message是我试图创建的格式化字符串,用于正确发送数组的所有内容。目前它是任意的,基本上没有什么意义,我把它用于调试目的

你的出发点不对。网络通信应从有线协议的设计开始

你将如何在电线上表现一些东西。二进制或文本。大多数“现代”协议使用文本(json或xml)。几年前,二进制是热门的(asn1/ber/der)。我建议使用json


那么你将如何包装有效载荷。你需要说‘这是一套XXX’吗。现在这里是一组YYYY。我不知道你在做什么,所以很难说你需要什么

如果你想发送20个字节,而且你知道数组中的每个整数值都在[-100,+100]范围内,你不应该使用
int
类型,在现代平台上通常包含32位或64位值

您可能需要使用
char
类型,它通常表示8位值

更确切地说,如果您可以使用C++11特性,那么应该使用
头,它定义了
int8\t
类型,保证是有符号的8位类型。看

您的阵列应该如下所示:

#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};
您的发送地址为:

sendto(sd,msgint,20,0,(struct sockadd *) &server,server_length);
“最后,我希望数组中的每个数字都作为自己的字节输出”

然后将数组更改为

char msgint[20] = ...

什么是
消息
?您如何接收数据?您是否尝试过在接收端使用相应的
recvfrom(sd,(char*)msgint,sizeof(msgint),…)
发送(sd,(char*)msgint,sizeof(msgint),…)(要求两个平台具有相同的端号和
int
size)?查看将
msgint
转换为
message
的代码可能非常有趣。否则,我恐怕你的问题将更难回答。在这个时候,这个消息只是随意的。目前,它在这一行中占据了一席之地,我尝试使用了一些我在这里其他地方找到的转换方法,但似乎都不起作用。接收端是一个DSpace MABXII,因此我正在使用他们的软件读取端口得到的信息,如果我尝试在发送函数中使用(char*),我会得到一个编译器错误,因为它是预期的(const char*),并且使用char msgint建议,我最终会出现一个套接字错误,它使我意识到我的问题实际上不在我的系统的C++侧。在非PowerPC上运行一个简单的服务器应用程序使我注意到问题所在,也就是说,我需要在Simulink中读取UDP的BaseStudy的误用。我没有意识到这是从第8单元到第32单元的自动关联。通过一个简单的解码功能,一切都开始按预期运行。
char msgint[20] = ...