0

我有一个使用 IOCP 进行套接字通信的客户端应用程序。我正在使用 ConnectEx 建立与远程端点的 TCP 连接(在调用 ConnectEx 之前将套接字绑定到 ADDR_ANY 和端口 0)。

与同一个远程端点(相同的 IP 地址和端口号)建立两个连接是有效的。当我使用当前代码测试该条件时,我有两个重叠的 IO 读取操作未完成(每个连接的套接字上一个)来自对 WSARecv() 的调用。每个 WSARecv() 都使用正确的套接字和重叠结构调用。例如:WSARecv(socket1, ...重叠1)和WSARecv(socket2, ...重叠2)。我遇到的问题是,当我从任一遥控器收到响应时,它会触发两个未完成的重叠操作的完成事件。我的代码仅在两个遥控器具有相同的 IP 地址和端口号时才产生此结果,而不是在有两个唯一的远程地址时产生此结果。这是预期的行为(希望不是)?如果是这样,是否有另一种方法来实现这一点?

4

1 回答 1

0

我发布了一个答案,即使它实际上只是对问题发生原因的解释。

我的测试涉及连接到提供数据的远程设备并与之通信。事实证明,它位于 digi 终端服务器的另一端。所以连接路径是:

我的测试计算机(通过 TCP)-> Digi 终端服务器(通过串行)-> 远程设备。

digi 终端服务器基本上将 TCP/IP 转换为串行通信,然后返回。由于串行端没有“连接”的概念,digi 不知道哪个 TCP/IP 连接应该接收串行数据以响应 TCP/IP 请求,因此它将串行数据转发到所有活动连接TCP/IP 端。这就是在我挂起的两个重叠操作上产生 IOCP 触发器的原因。每次向digi发送请求时,它都会从其串行端口发送请求。当终端设备响应时,数字将响应数据转发到我的每个 TCP/IP 连接。

感谢所有对我的问题发表评论的人,但很抱歉占用您的时间。

于 2017-11-08T15:32:31.973 回答