结合 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 中发送///
最后总结只要在重叠结构里定义一对嵌套字,针对嵌套字在处理线程里识别嵌套字,并且处理即可。
本文为原创文章,转载请注明出处!