【问题标题】:Sending numeric Array via UDP using winsock vc++使用winsock vc++通过UDP发送数字数组
【发布时间】:2014-07-22 15:44:59
【问题描述】:

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

我知道这条线是有效的,因为数据包通过它只是没有像我希望的那样出现。在发送到中,消息是我试图创建的格式化字符串,以正确发送数组的所有内容。目前是任意的,并且没有什么意义,我基本上将其用于调试目的。

【问题讨论】:

  • 什么是message?您如何接收数据?你有没有试过例如send(sd, (char*) msgint, sizeof(msgint), ...) 与接收端对应的recvfrom(sd, (char*) msgint, sizeof(msgint), ...)(要求两个平台具有相同的字节序和int 大小)?
  • 看看将msgint 转换为message 的代码可能会很有趣。否则恐怕你的问题会更难回答。
  • 此时消息只是任意的。目前它是该行中的一个占位符,我尝试使用我在此处其他地方找到的一些转换方法,但似乎都不起作用。接收端是 DSpace MABXII,所以我正在使用他们的软件来读取端口正在获取的内容我最终遇到了套接字错误

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


【解决方案1】:

你的出发点是错误的。网络通信应该从有线协议的设计开始。

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

那么你将如何包装有效载荷。你需要说'这是一组xxxs。现在这里是一组 yyyys'。我不知道你在做什么,所以很难说你需要什么

【讨论】:

    【解决方案2】:

    如果要发送 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(sd,msgint,20,0,(struct sockadd *) &server,server_length);
    

    【讨论】:

    • 使用 char msgint 建议,这让我意识到我的问题实际上不在系统的 c++ 端。在非 PowerPC 上运行简单的服务器应用程序让我注意到问题出在哪里撒谎,那是我需要在 simulink 中读取 UDP 的块集的误用。我没有注意到它正在将来自 unit8 的东西自动连接到 uint32。通过一个简单的解码功能,一切都开始按预期运行。
    【解决方案3】:

    “最后我希望数组中的每个数字都作为自己的字节输出”

    然后将您的数组更改为

    char msgint[20] = ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      相关资源
      最近更新 更多