ConnectEx连接到同一IP地址和端口的两个套接字会产生重复的IOCP事件

时间:2017-11-07 22:19:32

标签: sockets tcp iocp overlapped-io

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

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

1 个答案:

答案 0 :(得分:0)

我发布了一个答案,尽管这只是对问题发生原因的解释。

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

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

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

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