|
|
SOCKET s;
s = socket(AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET) {
// Error
if (CreateIoCompletionPort((HANDLE)s,
hIocp,
(ULONG_PTR)0,
0) == NULL)
{
// Error
}
???
}
到此为止socket已经成功和完成端口相关联。在此socket上进行的重叠IO操作结果均使用完成端口发出通知。注意:CreateIoCompletionPort函数的第三个参数允许开发人员传入一个类型为ULONG_PTR的数据成员,我们把它称为完成键(Completion key),此数据成员可以设计为指向包含socket信息的一个结构体的一个指针,用来把相关的环境信息和socket联系起来,每次完成通知来到的同时,该环境信息也随着通知一起返回给开发人员。
完成端口创建以及与socket关联之后,就要创建一个或多个工作线程来处理完成通知,每个线程都可以循环的调用GetQueuedCompletionStatus函数,检查完成端口上的通知事件。
在举例说明一个典型的工作线程的之前,我们先讨论一下重叠IO的过程。当一个重叠IO被发起,一个Overlapped结构体的指针就要作为参数传递给系统。当操作完成,GetQueueCompletionStatus可以返回指向同一个Overlapp结构的指针。为了辨认和定位这个已完成的操作,开发人员最好定义自己的OVERLAPPED结构,以包含一些自己定义的关于操作本身的额外信息。比如:
typedef struct _OVERLAPPEDPLUS {
OVERLAPPED ol;
SOCKET s, sclient;
int OpCode;
WSABUF wbuf;
DWORD dwBytes, dwFlags;
// other useful information
} OVERLAPPEDPLUS;
此结构的第一个成员为默认的OVERLAPPED结构,第二,三个为本地服务socket和与该操作相关的客户socekt,第4个成员为操作类型,对于socket,现在定义的有
#define OP_READ 0
#define OP_WRITE 1
#define OP_ACCEPT 2
3种。然后还有应用程序的socket缓冲区,操作数据量,标志位以及其他开发人员认为有用的信息。
当进行重叠IO操作,把OVERLAPPEDPLUS结构作为重叠IO的参数lpOverlapp传递(如WSASend,WASRecv,等函数,有一个lpOverlapped参数,要求传入一个OVERLAPP结构的指针)
当操作完成后,GetQueuedCompletionStatus函数返回一个LPOVERLAPPED 类型的指针,这个指针其实是指向开发人员定义的扩展OVERLAPPEDPLUS结构,包含着开发人员早先传入的全部信息。
注意: OVERLAPPED成员不一定要求是OVERLAPPEDPLUS扩展结构的一个成员,在获得OVERLAPPED指针之后,可以用CONTAINING_RECORD宏获得相应的扩展结构的指针。
典型的Worker Thread 结构
DWORD WINAPI WorkerThread(LPVOID lpParam)
{
ULONG_PTR *PerHandleKey;
OVERLAPPED *Overlap;
OVERLAPPEDPLUS *OverlapPlus,
*newolp;
DWORD dwBytesXfered;
while (1)
{
ret = GetQueuedCompletionStatus(
hIocp,
&dwBytesXfered,
(PULONG_PTR)&PerHandleKey,
&Overlap,
INFINITE);
if (ret == 0)
{
// Operation failed
continue;
}
OverlapPlus = CONTAINING_RECORD(Overlap, OVERLAPPEDPLUS, ol);
switch (OverlapPlus->OpCode)
{
case OP_ACCEPT:
// Client socket is contained in OverlapPlus.sclient
// Add client to completion port
CreateIoCompletionPort(
(HANDLE)OverlapPlus->sclient,
hIocp,
(ULONG_PTR)0,
0);
// Need a new OVERLAPPEDPLUS structure
// for the newly accepted socket. Perhaps
// keep a look as
上一页 [1] [2] [3] [4] [5] [6] 下一页
网友评论:(评论内容只代表网友观点,与本站立场无关!) |
阅读排行
|