V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
cchange
V2EX  ›  问与答

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

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

    大家好,我从事的是工业控制行业,计算机程序一般采用组态软件(类似 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   ·   实用小工具   ·   2896 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:47 · PVG 22:47 · LAX 07:47 · JFK 10:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.