关于重叠IO(overlapped)模型中完成例程使用的两点疑问
问题1:在完成例程的回调函数CALLBACK CompletionRoutine 内,如何通过回调参数 Overlapped 来判断是哪个套接字发生了IO操作?我看了几个例子,好像通常是自己定义一个结构体然后把WSAOVERLAPPDE放在第一的位置,然后在回调函数内强制转换,比如:
我不理解的是:为什么在回调函数内这样强制转化就能够得到是哪个套接字发生了IO操作呢?请大家帮我理解一下这里的指针操作!谢谢!
问题2:接上述问题,我是将自己定义的这个结构体换成了一个自己的用户类,CXEDUser,类里也定义了WSAOVERLAPPED结构体,而且也如结构体一样,定义了成员变量sock, flags, dwRecvBytes,等等。并且也把overlapped放到成员变量的第一位,然后用类的指针,按照结构体的方法强制转换,但是得到了一个颠倒的结果,overlapped变成了dwRecvBytes, dwRecvBytes变成了sock,也就是所取到的值和变量的名称不是对应的了,是错乱的,估计是指针进行强制转化的时候出了问题,请问要如何操作才能像结构体那样成功转化呢?
代码:
非常感谢
// 这里是定义的结构体
typedef struct _SOCKET_INFORMATION
{
WSAOVERLAPPED Overlapped; // 重叠结构 完成例程中此结构一定要放在最前面
CHAR cpIP[16];
CHAR Buffer[DATA_BUFSIZE];
WSABUF DataBuf;
SOCKET s;
}SOCKET_INFORMATION,*LPSOCKET_INFORMATION;
// CALLBACK CompletionRoutine 的第一行进行强制转换
LPSOCKET_INFORMATION SI = (LPSOCKET_INFORMATION)Overlapped;
我不理解的是:为什么在回调函数内这样强制转化就能够得到是哪个套接字发生了IO操作呢?请大家帮我理解一下这里的指针操作!谢谢!
问题2:接上述问题,我是将自己定义的这个结构体换成了一个自己的用户类,CXEDUser,类里也定义了WSAOVERLAPPED结构体,而且也如结构体一样,定义了成员变量sock, flags, dwRecvBytes,等等。并且也把overlapped放到成员变量的第一位,然后用类的指针,按照结构体的方法强制转换,但是得到了一个颠倒的结果,overlapped变成了dwRecvBytes, dwRecvBytes变成了sock,也就是所取到的值和变量的名称不是对应的了,是错乱的,估计是指针进行强制转化的时候出了问题,请问要如何操作才能像结构体那样成功转化呢?
代码:
// CXEDUser 类的头文件
class CXEDUser
{
public:
WSAOVERLAPPED m_Overlapped;
UINT m_uPort;
LPCTSTR m_lpIPAddress;
SOCKET m_UserSock;
WSAEVENT m_Event;
WSABUF m_DataBuf;
DWORD m_dwRecvBytes, m_dwFlags;
CXEDUser(SOCKET UserSock, LPCTSTR lpIPAddress, UINT uPort);
CXEDUser();
virtual ~CXEDUser();
};
// 在回调函数中的强制转化
CXEDUser* pUser = (CXEDUser*)Overlapped;
TRACE("%d\n", pUser->m_Overlapped);// 这里输出的结果变成了发生IO操作的字节数,也就是dwRecvBytes
非常感谢
...全文
相关推荐
基于完成例程的重叠IO模型
初步封装的基于完成例程的重叠IO模型,附有注释,希望对学习网络模型的同学有所帮助,共同进步
掌握Windows高效网络编程:完成例程的重叠IO模型
重叠I/O(Overlapped I/O),有时称为异步I/O或并行I/O,是一种编程技术,允许应用程序同时执行I/O操作和其它计算任务,而不必等待每个I/O操作完成。在传统的同步I/O模型中,当一个操作发起后,应用程序需要等待该操作完成才能继续执行下一行代码。与此相反,重叠I/O让I/O操作在后台执行,允许程序立即继续执行,当I/O操作完成后,程序会收到通知。完成例程是一段在I/O操作完成后被调用的代码。在操作系统中,完成例程是通过注册到I/O系统来实现的。
VC网络编程模型示例 - 重叠IO模型
VC网络编程模型示例之 - 重叠IO模型 配套讲解请参考我的blog http://blog.csdn.net/PiggyXP
重叠IO 完成例程 代码
测试用测试用测试用测试用测试用测试用测试用测试用测试用测试用测试用测试用测试用
socket工程文件重叠IO完成例程
socket通信的客户端和服务器端的工程文件,基于重叠IO完成例程技术,实现了多个客户端向服务器端持续发送数据


网络编程

