没有合适的资源?快使用搜索试试~ 我知道了~
IOPC完成端口编程自己总结(包含源码)
2星 需积分: 10 11 下载量 152 浏览量
2010-11-27
10:26:00
上传
评论
收藏 6KB TXT 举报
温馨提示
试读
7页
通过学习IOPC,把完成端口的流程及应用程序好实例总结出来,总结的非常细致,大家都能看懂,希望对大家有帮助!~~~~~
资源推荐
资源详情
资源评论
要分析的实例分为两个线程:分别是主线程(MAIN),还有一个是创建的线程(ServerThread)
1.主函数完成初始化工作:
1.1: (主线程)HANDLE hCompletion = ::CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0); 创建完成端口对象
1.2: (主线程)::CreateThread(NULL, 0, ServerThread, (LPVOID)hCompletion, 0, 0); 创建线程用于接收等
1.3:(主线程)调用socket(),SOCKADDR_IN,bind(),listen(),初始化套接字
1.4: (线程函数)HANDLE hCompletion = (HANDLE)lpParam; 通过线程参数得到完成端口对象
1.5: (线程函数) while(TRUE) 定义循环 循环等待套接字上发生事件
1.6:(线程函数) ::GetQueuedCompletionStatus() 在关联到此完成端口的所有套节字上等待I/O完成
1.7: (主线程) SOCKADDR_IN saRemote; SOCKET sNew = ::accept(sListen, (sockaddr*)&saRemote, &nRemoteLen); 为新连接建立结构并等待连接请求
2.有连接发生:
2.1: (主线程while循环中) PPER_HANDLE_DATA pPerHandle = (PPER_HANDLE_DATA)::GlobalAlloc(GPTR, sizeof(PER_HANDLE_DATA));
创建PPER_HANDLE_DATA结构
2.2: (主线程while循环中) ::CreateIoCompletionPort((HANDLE)pPerHandle->s, hCompletion, (DWORD)pPerHandle, 0);
完成 完成端口 与 套接字关联
2.3: (主线程while循环中) 给pPerIO结构 添加类型
PPER_IO_DATA pPerIO = (PPER_IO_DATA)::GlobalAlloc(GPTR, sizeof(PER_IO_DATA));
pPerIO->nOperationType = OP_READ;
WSABUF buf;
buf.buf = pPerIO->buf;
buf.len = BUFFER_SIZE;
DWORD dwRecv;
DWORD dwFlags = 0;
2.4: (主线程while循环中) ::WSARecv(pPerHandle->s, &buf, 1, &dwRecv, &dwFlags, &pPerIO->ol, NULL); 发送异步接收请求
2.5: (主线程while循环中) 回到WHILE循环accept()函数处 等待新连接
2.6: (线程函数while循环中)GetQueuedCompletionStatus() 此时I/O完成 开始处理消息
2.7: (线程函数while循环中)pPerIO->nOperationType 通过类型判断 消息类型
2.7:(线程函数while循环中)打印接收的消息 并在此投递 一个完成端口
pPerIO->buf[dwTrans] = '\0';
printf(pPerIO -> buf);
1.主函数完成初始化工作:
1.1: (主线程)HANDLE hCompletion = ::CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0); 创建完成端口对象
1.2: (主线程)::CreateThread(NULL, 0, ServerThread, (LPVOID)hCompletion, 0, 0); 创建线程用于接收等
1.3:(主线程)调用socket(),SOCKADDR_IN,bind(),listen(),初始化套接字
1.4: (线程函数)HANDLE hCompletion = (HANDLE)lpParam; 通过线程参数得到完成端口对象
1.5: (线程函数) while(TRUE) 定义循环 循环等待套接字上发生事件
1.6:(线程函数) ::GetQueuedCompletionStatus() 在关联到此完成端口的所有套节字上等待I/O完成
1.7: (主线程) SOCKADDR_IN saRemote; SOCKET sNew = ::accept(sListen, (sockaddr*)&saRemote, &nRemoteLen); 为新连接建立结构并等待连接请求
2.有连接发生:
2.1: (主线程while循环中) PPER_HANDLE_DATA pPerHandle = (PPER_HANDLE_DATA)::GlobalAlloc(GPTR, sizeof(PER_HANDLE_DATA));
创建PPER_HANDLE_DATA结构
2.2: (主线程while循环中) ::CreateIoCompletionPort((HANDLE)pPerHandle->s, hCompletion, (DWORD)pPerHandle, 0);
完成 完成端口 与 套接字关联
2.3: (主线程while循环中) 给pPerIO结构 添加类型
PPER_IO_DATA pPerIO = (PPER_IO_DATA)::GlobalAlloc(GPTR, sizeof(PER_IO_DATA));
pPerIO->nOperationType = OP_READ;
WSABUF buf;
buf.buf = pPerIO->buf;
buf.len = BUFFER_SIZE;
DWORD dwRecv;
DWORD dwFlags = 0;
2.4: (主线程while循环中) ::WSARecv(pPerHandle->s, &buf, 1, &dwRecv, &dwFlags, &pPerIO->ol, NULL); 发送异步接收请求
2.5: (主线程while循环中) 回到WHILE循环accept()函数处 等待新连接
2.6: (线程函数while循环中)GetQueuedCompletionStatus() 此时I/O完成 开始处理消息
2.7: (线程函数while循环中)pPerIO->nOperationType 通过类型判断 消息类型
2.7:(线程函数while循环中)打印接收的消息 并在此投递 一个完成端口
pPerIO->buf[dwTrans] = '\0';
printf(pPerIO -> buf);
WSABUF buf;
buf.buf = pPerIO->buf ;
buf.len = BUFFER_SIZE;
pPerIO->nOperationType = OP_READ;
DWORD nFlags = 0;
printf("12\n");
::WSARecv(pPerHandle->s, &buf, 1, &dwTrans, &nFlags, &pPerIO->ol, NULL);
2.8:(线程函数while循环中) 由于又有端口I/O完成 ::GetQueuedCompletionStatus()函数 继续判断并处理
2.9:(线程函数while循环中) 由于没有数据 GetQueuedCompletionStatus()返回值为错误 调用一下函数关闭
::closesocket(pPerHandle->s);
::GlobalFree(pPerHandle);
::GlobalFree(pPerIO);
2.10:(线程函数while循环中) 在此回到while循环 调用::GetQueuedCompletionStatus()函数 继续等待
分析完成 完整代码如下:
#include "../common/initsock.h"
#include <stdio.h>
#include <windows.h>
// 初始化Winsock库
CInitSock theSock;
#define BUFFER_SIZE 1024
typedef struct _PER_HANDLE_DATA // per-handle数据
{
SOCKET s; // 对应的套节字句柄
sockaddr_in addr; // 客户方地址
} PER_HANDLE_DATA, *PPER_HANDLE_DATA;
buf.buf = pPerIO->buf ;
buf.len = BUFFER_SIZE;
pPerIO->nOperationType = OP_READ;
DWORD nFlags = 0;
printf("12\n");
::WSARecv(pPerHandle->s, &buf, 1, &dwTrans, &nFlags, &pPerIO->ol, NULL);
2.8:(线程函数while循环中) 由于又有端口I/O完成 ::GetQueuedCompletionStatus()函数 继续判断并处理
2.9:(线程函数while循环中) 由于没有数据 GetQueuedCompletionStatus()返回值为错误 调用一下函数关闭
::closesocket(pPerHandle->s);
::GlobalFree(pPerHandle);
::GlobalFree(pPerIO);
2.10:(线程函数while循环中) 在此回到while循环 调用::GetQueuedCompletionStatus()函数 继续等待
分析完成 完整代码如下:
#include "../common/initsock.h"
#include <stdio.h>
#include <windows.h>
// 初始化Winsock库
CInitSock theSock;
#define BUFFER_SIZE 1024
typedef struct _PER_HANDLE_DATA // per-handle数据
{
SOCKET s; // 对应的套节字句柄
sockaddr_in addr; // 客户方地址
} PER_HANDLE_DATA, *PPER_HANDLE_DATA;
剩余6页未读,继续阅读
资源评论
- fqin172013-05-26太贵了,抢钱,不值!
- binhongli2013-10-21太简单了 一般的介绍 下载的三思
- Alsmile2012-11-22就一个简介的txt而已,还不如网上其他详细,还要这么高分
yangshuo543
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功