完成式端口如何区分接收方和发送方。

结合 mproxysvr3 源代码,可以分析出具体实现的过程。

首先是 结构定义

typedef struct TagLPWSAOVERLAPPEDEX
{
WSAOVERLAPPED Overlapped; //重叠结构
WSABUF WSABuf;//socket数据缓冲
char Buffer[DATA_BUFSIZE];//wsaBuf指向的真实数据位置
SOCKET hSocket;//socket 句柄
SOCKET hSocketPair;//相关的socket句柄
LPVOID pProxy3;//指向代理对象
int nSocketType;
int nIOType;
TagLPWSAOVERLAPPEDEX *pPair;//指向相关socket的重叠扩展结构

}WSAOVERLAPPEDEX, *LPWSAOVERLAPPEDEX;//重叠扩展结构

 

ehSocket == lpOvlpEx->hSocketPair
一、内部的 WSASend WSARecv 和外部的 Recv Send 是一样的。

二、完成端口是独立的封闭的,收发的数据,他里面都存着, 他处理完了,发完成消息 出来。。

三、无论内部还是外部往完成端口里面的SOCKET甲 发送一个字符串 那么 内部和外部都可以 RECV SOCKET甲 得到这个字符串。

四、完成端口, 客户端RECV 服务器是没有响应的。

数据发送完,转入接收状态
// lpOvlpEx->WSABuf 缓冲是公用的 是参照物。 lpOvlpEx重叠块 是参照物
//当前的 hSocket 和 重叠块中的lpOvlpEx->hSocketPair 相同 ,则从 lpOvlpEx->hSocket 中读取数据
//其实是从当前的链接中读取数据

( hSocket ) 是链接的 SOCKET 是参照物, lpOvlpEx->hSocketPair 和 lpOvlpEx->hSocket 都是相对的,/ hSocket 和 lpOvlpEx->hSocket 不对应,

第二种情况 hSocket == lpOvlpEx->hSocketPair ; 是有第一种情况完成后 出发的,
是服务器内的动作 WSASend(lpOvlpEx->hSocketPai产生的 触发事件

第二种情况的完成 也会触发第一种情况

整套系统,过滤掉了外部触发事件。这个不正确;

由于( hSocket ) 分两种,所以 一共有4中情况的,
上面的过程相反, 到最后是 往 伴侣的SOCK 中发送///

 

最后总结只要在重叠结构里定义一对嵌套字,针对嵌套字在处理线程里识别嵌套字,并且处理即可。

本文为原创文章,转载请注明出处!