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

时间:2014-07-22 15:44:59

标签: c++ arrays sockets visual-c++ udp

已解决:问题主要在于读取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)

我知道这条线可以正常工作,因为它不会像我希望的那样出现。在发送到,消息是我试图创建的格式化字符串,以正确发送数组的所有内容。目前是任意的,没有什么意义我将其用于调试目的。

3 个答案:

答案 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] = ...