一个需要解析以太网 socket 包的 Win32 桌面程序编写 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cchange
V2EX    问与答

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

  cchange 2017-02-15 14:28:25 +08:00 3082 次点击
这是一个创建于 3170 天前的主题,其中的信息可能已经有所发展或是发生改变。

大家好,我从事的是工业控制行业,计算机程序一般采用组态软件(类似 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.

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

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

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

C++的 boost 库里 ASIO 收下了 待会儿就去研究研究
wevsty
    10
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
    11
thomaspaine  
   2017-02-15 17:55:39 +08:00
@cchange 桌面程序选 Qt 啊,你要的什么数据库支持, socket 支持都有,性能也不错,也支持 xp
用 python 写,写界面的时候还不是用 PyQt ……
mkeith
    12
mkeith  
   2017-02-15 22:38:01 +08:00
go 写 tcp 同行很方便的,我现在就是用的 go 写的 tcpsever 内部还嵌了个 webserver 来控制程序
cchange
    13
cchange  
OP
   2017-02-16 08:17:27 +08:00 via iPhone
@wevsty 非常感谢 这个架构基本没问题了 我尽可能选择自己熟悉的语言
cchange
    14
cchange  
OP
   2017-02-16 08:18:45 +08:00 via iPhone
@mkeith 好的 我看看 go 语言 按大家描述 感觉 go 语言确实方便了好多
cchange
    15
cchange  
OP
   2017-02-16 08:19:32 +08:00 via iPhone
@thomaspaine 好的 我以 Qt 为关键词搜搜看 多谢
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2927 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 24ms UTC 00:29 PVG 08:29 LAX 17:29 JFK 20:29
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86