一个需要解析以太网 socket 包的 Win32 桌面程序编写

2017-02-15 14:28:25 +08:00
 cchange

大家好,我从事的是工业控制行业,计算机程序一般采用组态软件(类似 Builder 的),自由度很低,所以一直想编写一个通过以太网通讯的程序,这个程序的我总结的需求如下描述,开发 Win32 程序实在不是我的强项,正好需求对实时性要求高,与之前的大学同学聊了聊却又都没有相关经验,所以向大家求助。

我们的设备需要和 PLC 通讯,就是嵌入式设备。他可以发出 TCP/IP 包,以 100ms 或 50ms 发送一次数据包(这个可以用 TCP/IP 调试工具模拟),数据长度不超过 32Bytes ,拟采用 win32 桌面程序接收该信号,自定义一个报文,这样可以将 PLC 中的变量传到 PC 中,也可以进行双向通讯,计算机做 server , plc 做 client 。现在的问题是我们的系统目前必须部署在 XP 上,所以打算采用 Visual Studio 2010 sp1 的 C#来编写该程序,有人说 C#的性能欠佳,我也有点担心是否 100ms/50ms 接受相关数据,接受相关程序后再采用写 ini 文件,写 sqlite 或 Access 的数据库,功能逐步迭代演进。

本来想用 C++来写,但是之前参与开发调试的 C++程序总是出现内存泄露问题,而且对 C++不是很熟悉,所以想用 C#来开发,请问大家有别的意见吗?

如果大家知道类似的 C#或其他语言读写 TCP IP 的协议的开源项目,请告诉我名称,我 goolge 一下参考参考,我不想做伸手党,请要告诉名称即可。

诚心求教 非常感谢~

Best Regards.

2625 次点击
所在节点    问与答
15 条回复
amaranthf
2017-02-15 14:53:49 +08:00
C#在 xp 上跑还得要运行库,建议用 go 语言试试,同样不用担心内存泄露等问题。
另外,绝大部分语言都有现成的、内置或者属于标准库内的 TCP/IP 支持,直接搜索语言自身的文档就好。
lancerliu
2017-02-15 15:14:05 +08:00
先问一下,你是要模拟 PLC client 进行通讯,还是直接截取通讯的数据?
OIseekU
2017-02-15 15:31:18 +08:00
这个不难吧,直接安装 winpcap 库,利用 winpcap 提供的 api ,这样可以拿到完整的数据包,然后根据自定义的协议进行解析。另:个人感觉即使 c#性能再差也可以接收 100ms/50ms 的数据包吧
wevsty
2017-02-15 16:15:41 +08:00
PC 上的通信 50ms 一个包无论是什么开发语言基本上都可以满足要求,不必执着于 C++或者 C#,选一门自己熟悉的语言会更有帮助。
必须 XP 是一个坑,设计的时候建议能抛弃 XP 就不要用 XP ,我不明白为什么一定必须使用 XP 。如果是考虑授权问题,那么建议使用 Linux 而不是 XP 。
针对需求,个人理解是直接 PC 上写个 TCP Server 和 PLC 进行通讯,单纯针对这个需求,可能使用 Python 会比较方便(当然,如果使用 XP 就不能使用新版本的 Python ,这又是个坑)。
C#不太了解,不乱说。
C++的话,如果要使用 C++开发,可以考虑使用 Boost 的 ASIO 。
Andiry
2017-02-15 16:33:14 +08:00
50ms ,用任何语言性能都不是问题,选熟悉的就好
wojiushimogui
2017-02-15 16:39:29 +08:00
三楼提到了 winpcap ,自己使用它做过网口通信,还可以,使用相应的 demo 改改就可以了,这个在 Java 中也有相同的类库
cchange
2017-02-15 16:40:26 +08:00
@amaranthf 多谢 实际上 C#与 go 不太熟悉,所以确实可以考虑 go 语言 但是考虑 go 语言是不是集成开发环境比较差,
XP 保留兼容性, 以后必然要切换到 win10 和 win7 上的
多谢
cchange
2017-02-15 16:43:43 +08:00
@lancerliu PLC 有,不需要模拟,架设硬件比较麻烦 所以会用网络调试助手,不需要截取~
cchange
2017-02-15 16:48:57 +08:00
@wevsty 谢谢
我会用比较熟悉的编程语言

必须 XP 是因为有些软件只有 XP 版本,这个是历史遗留问题,我编写这个软件一方面也是想讲软件控制权重新拿回来,替换相关旧的软件。

请问 Python 有什么类库是做这个呢? 告诉我名称即可。

C++的 boost 库里 ASIO 收下了 待会儿就去研究研究
wevsty
2017-02-15 17:09:23 +08:00
@cchange
Python 的话标准的 TCP 链接用标准库就足够了。
官方文档 https://docs.python.org/3/library/socket.html
(这个文档是 Python3 的, Python2 和 Python3 有些区别,推荐使用 Python3 ,但是新版本不能兼容 XP )

一般来说,应用层的程序直接升级通常不会有太多问题。如果是计划升级 OS ,那么建议一开始就决定好。

对 C++来说,用 Boost 的好处是显而易见的, VS2010 有一部分最新的 C++特性不支持, Boost 可以补足部分, ASIO 封装过的 Socket 后期移植到新系统甚至更换到 Linux 也是比较容易的。
thomaspaine
2017-02-15 17:55:39 +08:00
@cchange 桌面程序选 Qt 啊,你要的什么数据库支持, socket 支持都有,性能也不错,也支持 xp
用 python 写,写界面的时候还不是用 PyQt ……
mkeith
2017-02-15 22:38:01 +08:00
go 写 tcp 同行很方便的,我现在就是用的 go 写的 tcpsever 内部还嵌了个 webserver 来控制程序
cchange
2017-02-16 08:17:27 +08:00
@wevsty 非常感谢 这个架构基本没问题了 我尽可能选择自己熟悉的语言
cchange
2017-02-16 08:18:45 +08:00
@mkeith 好的 我看看 go 语言 按大家描述 感觉 go 语言确实方便了好多
cchange
2017-02-16 08:19:32 +08:00
@thomaspaine 好的 我以 Qt 为关键词搜搜看 多谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/340636

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX