首页 > 解决方案 > 没有 Doevents 或子类的 VB6 TCP IP 通信

问题描述

我需要维护的 VB6 应用程序如下所示。

  1. 通过以太网建立与已知地址和端口的连接。
  2. 发送请求

  3. 等待回复。

我尝试使用 WinSock 和 Winsock 替换,但它们都以一种或另一种形式依赖于各种 Windows 应用程序中固有的消息传递循环。我对 Winsock API 如何在 VB6(或任何其他语言)中实现上述算法知之甚少。

我的应用程序是一个 VB6 CAD/CAM 软件,它通过专用以太网控制金属切割机。该软件已经维护了 20 年,我们为不同类型的运动控制器开发了多种驱动程序。迄今为止,这些运动控制器的 API 包括

  1. 打开与硬件的连接
  2. 向硬件发送请求(例如轴的位置)
  3. 等待响应(通常以毫秒为单位)。

其中一些控制器通过以太网工作,但直到现在我才不必直接与端口交互。我使用公司提供的图书馆来处理事情。它们以我上面提到的方式工作,如果在某个定义的时间内没有发生响应,则会引发超时错误。

Winsock 的问题是我必须插入 DoEvents 才能得到响应。这会破坏我们在 VB6 应用程序中处理多任务的方式。像 CSocketMaster 这样的替代品使用子类化,这也会对我们的多任务处理造成严重破坏。

因此,有关如何使用 Winsock API 或第三方 dll 的任何帮助都可以完成我需要做的事情,如上所述。我不会问我是否还没有看到其他运动控制做我想做的事情。

标签: vb6winsockwinsockets

解决方案


查看github 上的VbAsyncSocket 存储WSAAsyncSelect库,了解纯 VB6 异步套接字实现(使用API 用于套接字发布事件通知)。

与它的名字相反,该类确实支持同步操作SyncSendArraySyncReceiveArray方法——没有DoEvents但有Timeouts。

在同一个 repo 中有一个方便的贡献类,它与嵌入操作系统cWinSockRequest的对象非常相似。WinHttpRequest如果您有使用 JSON/XML(通常是通过 http/https 的 RESTful 服务)通过普通 tcp/udp 套接字访问服务/设备的经验,那么这个帮助程序类将非常熟悉。

另一种选择是使用cTlsClient贡献类,它可以通过 tcp 连接到主机/设备(这里没有 udp)并提供ReadText/WriteTextReadArray/ WriteArray(同步)方法。这里的额外好处是,如果需要,该类同时支持普通的未加密套接字和 SSL 加密通道。

我们正在使用这些类从我们的 LOB 应用程序(同步)访问 ESP/POS 打印机。大多数 POS 打印机也提供串行(USB 到 COM)链接,因此我们正在抽象使用连接器类的访问——SyncWaitForEvent通过异步套接字和WaitForMultipleObjects重叠的ReadFile/ WriteFileAPI(哦,具有讽刺意味)


推荐阅读