您现在的位置: 中国教师站 >> 教师关注 >> 电脑技术 >> 编程技术 >> Visual C >> 正文

Google
Windows Sockets 2.0:使用完成端口高性能,可扩展性Wi
作者:Siny 文章来源:中国教师站cn-teacher 点击数: 更新时间:2007-4-22 12:55:13
t并把它和完成端口联系起来。

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] 下一页

相关专题:
 
 网友评论:(评论内容只代表网友观点,与本站立场无关!)
GOOGLE广告

阅读排行

| 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 |
中国教师站

中国教师站 版权所有 Copyright © 2006-2020 All Rights Reserved 站长:Sina & Siny
[备用域名:www.JXZYW.Com] 有事请留言有事请留言
【实力成就精品 诚信呵护品牌】

信息产业部备案
苏ICP备06018635号