shuaishuai24 2016-06-15 03:26 采纳率: 75%
浏览 3603
已采纳

请问按TCP协议,用soket发送这样的数据,应该按照什么格式?

图片说明
如图所示,每行数据都是一个控制电文。比如我想打开设备3,就发送图中所示的 01 05 00 02 FF 00 2D FA,这些都是十六进制数,用scoket发送。这个设备用的是虚拟串口,服务器端是硬件解包,我是做上位机(客户端)的。

以打开设备3为例,我尝试了发送
BYTE buff[]={0x01,0x05,0x00,0x02,0xFF,0x00,0x2D,0xFA};
send(sClient,(LPCSTR)buff,8,0)
但是设备3没有打开,我用一个叫net tools的小工具作为服务器端测试,显示没有接受到任何数据,但是我觉得这样是符合send函数的使用方法的啊,怎么会没反应的。。。
我又尝试了发送 char buff[]="01 05 00 02 FF 00 2D FA ",设备3还是没有打开,用net tools接收数据,显示接收到01 05 00 02 FF 00 2D FA.

我不明白的地方是,send 函数到底应该怎么发送十六进制的字符串呢?我觉得我第二次尝试的办法发送的不是十六进制数啊,它应该会根据ascii码解释为其他形式的十六进制数吧。ps:这个设备还有其他形式的电文 如wx2010+0x0A这样的形式,都是按
它们的ASCII码解的。
我是新手,刚接触这些,我用C++编写代码,但是我对string类了解不是很深刻,请问是应该用string类型发送吗?希望有高手可以帮我解答一下,最好可以给我推荐一些相关的书籍或者资料,非常感谢!!如果能有个例子的话,就更好了。

  • 写回答

4条回答 默认 最新

  • 小程序员 2016-06-16 01:14
    关注

    数据在传输过程中都是byte的,也就是説你发送或者接收的数据都是byte[]类型的,在程序中,协议和发送接收是分离开的,发送接收只负责接收byte[]数据或发送byte[]数据,不会又协议的问题导致无法接收到数据的情况。你这样测试:
    首先测试下你的发送模块是否能发送出去数据,发送什么数据随意,接收端可以随便下载个socket测试工具来接收,能接收了再把服务端切换为自己写的接收程序,在Recevie的下一行直接打印出byte[]数据,如果能打印出来的话说明发送接收没问题,记得这个要多测试几遍。
    发送接收没问题后要测试下协议的组装与解析有没有问题,先检查下发送的时候用的是什么编码方式,接收的时候你要用同样的编码方式来解析,按照:BYTE buff[]={0x01,0x05,0x00,0x02,0xFF,0x00,0x2D,0xFA};你这种做法就是直接16进制数据转byte的,所以你接收到数据后不能用ascii来解码,解码会出现乱码,这种情况你要对buff数据一个个位去转为16进制,然后判断每一位的值;
    按照你后面说的char buff[]="01 05 00 02 FF 00 2D FA "其实就是一个string类型的,因为你后面还有wx2010+0x0A这种的报文;
    所以你整个的做法应该是:
    1、原始协议是字符串类型的,然后通过ascii编码转为byte数组,然后通过send(byte[],......)方法发送出去;
    2、接收到byte数组后按照ascii编码把数据转为string,然后对string进行解析判断;

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码