Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我发送的tcp帧上的modbus有一半无效 我做了一个C++应用程序,我需要通过TCP通信从该应用程序获得一些统计数据到Modbus设备。TCP通信由套接字进行,我使用send()发送数据_C++_Sockets_Tcp_Modbus - Fatal编程技术网

我发送的tcp帧上的modbus有一半无效 我做了一个C++应用程序,我需要通过TCP通信从该应用程序获得一些统计数据到Modbus设备。TCP通信由套接字进行,我使用send()发送数据

我发送的tcp帧上的modbus有一半无效 我做了一个C++应用程序,我需要通过TCP通信从该应用程序获得一些统计数据到Modbus设备。TCP通信由套接字进行,我使用send()发送数据,c++,sockets,tcp,modbus,C++,Sockets,Tcp,Modbus,现在有一半的帧似乎是无效的:连接后的第一帧总是有效的,然后第二帧总是错误的。。。等等无论何时我开始一个新的连接,第一帧都是有效的 因此,我在Wireshark和data wise上检查了Modbus数据是否相同(除了正常的事务标识符)。唯一表明问题的是,如果我在Wireshark选项中“允许子分离器重新组装tcp流”,Wireshark不会将该帧视为Modbus帧。我有一个新字段:“2个重新组装的tcp段(29字节):#79391(1),#79404(28)”其中#79391是最后一个正确帧的帧

现在有一半的帧似乎是无效的:连接后的第一帧总是有效的,然后第二帧总是错误的。。。等等无论何时我开始一个新的连接,第一帧都是有效的

因此,我在Wireshark和data wise上检查了Modbus数据是否相同(除了正常的事务标识符)。唯一表明问题的是,如果我在Wireshark选项中“允许子分离器重新组装tcp流”,Wireshark不会将该帧视为Modbus帧。我有一个新字段:“2个重新组装的tcp段(29字节):#79391(1),#79404(28)”其中#79391是最后一个正确帧的帧号#79404是当前帧的帧号

为了避免这种情况,我尝试通过允许tcp_节点延迟来刷新tcp缓冲区,得到了完全相同的结果。因此,如果有人知道如何发送数据以避免重新组装框架,我很乐意尝试任何解决方案


编辑:我已经解决了我的问题,当然TCP没有错。但是它做了一些我不可能做的事情,将缓冲区中无用的数据添加到下一帧。长话短说,我没有发送正确数量的数据。

我已经解决了我的问题,当然TCP没有错。但是它做了一些我不可能做的事情,将缓冲区中无用的数据添加到下一帧。长话短说,我没有发送正确数量的数据朱利安·阿马尔(Julien Amar)

为什么你认为这些帧是无效的?TCP被允许以它想要的任何方式将流分解成数据包;这就是它的工作原理。因此Ethereal/Wireshark需要重新组装TCP流,以便能够看到Modbus消息。这并不意味着它们有什么问题。我的modbus主控软件无法从它的查询中理解一对二的答案。所以我使用了几个modbus主模拟器来测试我的modbus从机,我得到了相同的结果。其中之一:QModMaster允许查看modbus帧。在Wireshark显示2个重新组装的片段的帧上,模拟器说:错误->从抛出异常,而TCP帧上的modbus部分是正确的,是期望的答案