vb6 - 没有 Doevents 或子类的 VB6 TCP IP 通信
问题描述
我需要维护的 VB6 应用程序如下所示。
- 通过以太网建立与已知地址和端口的连接。
发送请求
等待回复。
我尝试使用 WinSock 和 Winsock 替换,但它们都以一种或另一种形式依赖于各种 Windows 应用程序中固有的消息传递循环。我对 Winsock API 如何在 VB6(或任何其他语言)中实现上述算法知之甚少。
我的应用程序是一个 VB6 CAD/CAM 软件,它通过专用以太网控制金属切割机。该软件已经维护了 20 年,我们为不同类型的运动控制器开发了多种驱动程序。迄今为止,这些运动控制器的 API 包括
- 打开与硬件的连接
- 向硬件发送请求(例如轴的位置)
- 等待响应(通常以毫秒为单位)。
其中一些控制器通过以太网工作,但直到现在我才不必直接与端口交互。我使用公司提供的图书馆来处理事情。它们以我上面提到的方式工作,如果在某个定义的时间内没有发生响应,则会引发超时错误。
Winsock 的问题是我必须插入 DoEvents 才能得到响应。这会破坏我们在 VB6 应用程序中处理多任务的方式。像 CSocketMaster 这样的替代品使用子类化,这也会对我们的多任务处理造成严重破坏。
因此,有关如何使用 Winsock API 或第三方 dll 的任何帮助都可以完成我需要做的事情,如上所述。我不会问我是否还没有看到其他运动控制做我想做的事情。
解决方案
查看github 上的VbAsyncSocket 存储WSAAsyncSelect
库,了解纯 VB6 异步套接字实现(使用API 用于套接字发布事件通知)。
与它的名字相反,该类确实支持同步操作SyncSendArray
和SyncReceiveArray
方法——没有DoEvents
但有Timeout
s。
在同一个 repo 中有一个方便的贡献类,它与嵌入操作系统cWinSockRequest
的对象非常相似。WinHttpRequest
如果您有使用 JSON/XML(通常是通过 http/https 的 RESTful 服务)通过普通 tcp/udp 套接字访问服务/设备的经验,那么这个帮助程序类将非常熟悉。
另一种选择是使用cTlsClient
贡献类,它可以通过 tcp 连接到主机/设备(这里没有 udp)并提供ReadText
/WriteText
和ReadArray
/ WriteArray
(同步)方法。这里的额外好处是,如果需要,该类同时支持普通的未加密套接字和 SSL 加密通道。
我们正在使用这些类从我们的 LOB 应用程序(同步)访问 ESP/POS 打印机。大多数 POS 打印机也提供串行(USB 到 COM)链接,因此我们正在抽象使用连接器类的访问——SyncWaitForEvent
通过异步套接字和WaitForMultipleObjects
重叠的ReadFile
/ WriteFile
API(哦,具有讽刺意味)
推荐阅读
- reactjs - 如何使用 Ant Design 将输入数字限制为最多两位小数?
- fortran - Fortran 中精度规范的标准是什么?
- c# - Unity3D构建卡在场景0
- java - 如何找到以给定字符串开头的单词?
- google-apps-script - 使用 Apps 脚本合并富文本邮件
- sql - 如何在 SQL FUNCTION 中向 RETURN 添加条件?
- angular - 无法将数据发送到后端
- angular - 是否可以在 Angular 中更改视图/ HTML 中的模型变量值?
- c# - 实体框架的“使用”关键字与类字段
- wkhtmltopdf - 将带有 css 类和背景图像的富 html 转换为 PDF