步I/O请求的应用程序来说,相比于在I/O请求发生时创建线程来说,使用完成端口它就可以做的更快且更有效率。IOCP是Windows平台最高效的通信模型,可以在一个应用程序同时管理为数众多的套接字,以达到最佳的系统性能!从本质上说,完成端口模型要求我们创建一个Win32完成端口对象,通过指定数量的线程,对重叠I/O请求进行管理,以便为已经完成的重叠I/O请求提供服务。完成端口的相关函数或结构[21]:
(1)创建完成端口或绑定句柄
HANDLE CreateIoCompletionPort(
HANDLE FileHandle,
HANDLE ExistingCompletionPort,
ULONG_PTR CompletionKey,
DWORD NumberOfConcurrentThreads
);
(2)获取排队完成状态
BOOL GetQueuedCompletionStatus(
HANDLE CompletionPort,
LPDWORD lpNumberOfBytes,
PULONG_PTR lpCompletionKey,
LPOVERLAPPED* lpOverlapped,
DWORD dwMilliseconds
);本文来自优.文~论^文·网原文请找腾讯3249,114
(3)用OVERLAPPED Overlapped;开头封装一个自定义OVERLAPPED结构用来投递I/O工作者
typedef struct _PER_IO_OPERATION_DATA
{
//重叠结构
OVERLAPPED OverLapped;
//数据缓冲区
WSABUF RecvDataBuf;
WSABUF SendDataBuf;
char RecvBuf[BUFFER_SIZE];
char SendBuf[BUFFER_SIZE];
//操作类型表示
bool OperType;
}PER_IO_OPERATION_DATA,*PPER_IO_OPERATION_DATA;
PER_IO_OPERATION_DATA PerIoWorker;
WSARecv(socket, ..., (OVERLAPPED *)&PerIoWorker;);
(4)向工作者线程都发送一个完成数据包
BOOL PostQueuedCompletionStatus(
HANDLE CompletionPort,
DWORD dwNumberOfBytesTransferred,
ULONG_PTR dwCompletionKey,
LPOVERLAPPED lpOverlapped
);
2.3 HOOK技术
2.3.1 Windows消息传递机制
当在应用程序窗口中按下鼠标左键时,操作系统会感知这一事件,然后产生鼠标左键消息,接着把此消息放到相应程序的消息队列中,应用程序通过调用GetMessage函数取出消息,然后调用DispatchMessage函数将这条消息调度给操作系统,操作系统会调用在设计窗口类时指定的应用程序窗口对这一消息进行处理。这一过程就是所有运行在Windows平台下的窗口应用程序的消息传递过程,如下图:
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>
C++的多媒体屏幕广播教学系统设计 第3页下载如图片无法显示或论文不完整,请联系qq752018766