完毕port模型
完毕port模型过程例如以下:
1.调用CreateIoCompletionPort函数创建完毕port。
HANDLE CompletionPort=CreateIoCompletionStatus(INVALID_HANDLE_VALUE,NULL,0,0);
2.创建和处理器数目相等的工作线程
SYSTEM_INFO SysInfo;
GetSystemInfo(&SysInfo);
for(int i=0;i<SysInfo.)
for(int i=0;i<(sysInfo.dwNumberOfProcessors);i++)
{ HANDLE ThreadHandle=(HANDLE)_beginthreadex(NULL,0,CompletionPortProcessor,ComplPort,0,NULL); CloseHandle(ThreadHandle);
}
3.接受客服端连接请求,创建单句柄数据,调用CreateIoCompletionPort将客服端套接字绑定到完毕port上。
单据句柄数据结构能够自定义字段:
struct PTR_HANDLE_DATA
{//字段能够任意定义
SOCKET s;
int i;
}
将套接字绑定到完毕port上:
CreateIoCompletionPort(sClient,CompletionPort,(DWORD)PerHandleData,0);
4.创建单I/O数据。并将单I/O数据作为參数传递给重叠I/O函数:WSARecv、WSASend.
创建单I/O数据,该字段除了第一个字段必须为重叠结构OVERLAPPED外。其它字段能够自定义:
<pre class="cpp" name="code">struct PER_IO_DATA
{
OVERLAPPED Overlapped;
WSABUF DataBuf;
char Buffer[DATA_BUFFER];
int OperationType;
};
调用重叠I/O函数:
WSARecv(PerHandleData->socket, &PerIoData->DataBuf, 1, &dwRecv, &Flags, &PerIoData->Overlapped, NULL);
5.在工作线程中,调用GetQueuedCompletionStatus函数等待完毕port的完毕请求。
GetQueuedCompletionStatus(CompletionPort, &BytesTransferred, (LPDWORD)&PerHandleData, (LPOVERLAPPED*)&PerIoData, INFINITE))
6.等待成功后,对请求处理。假设须要再次投递一个重叠I/O。
一个简单的样例例如以下
#include <WinSock2.h>
#include <stdio.h>
#include <string.h>
#include <ws2tcpip.h>
#include <process.h>
#pragma comment(lib, "ws2_32.lib ") //linking to the library
#define DATA_BUFFER 4*1024
#define RECV_OPERATION 1
#define SEND_OPERATION 2 struct PTR_HANDLE_DATA
{
SOCKET socket;
int Location;
};
struct PER_IO_DATA
{
OVERLAPPED Overlapped;
WSABUF DataBuf;
char Buffer[DATA_BUFFER];
int OperationType;
};
unsigned int WINAPI CompletionPortProcessor(PVOID lParam)
{
HANDLE CompletionPort = (HANDLE)lParam;
DWORD BytesTransferred;
PTR_HANDLE_DATA *PerHandleData;
PER_IO_DATA *PerIoData; while(true)
{ if(0 == GetQueuedCompletionStatus(CompletionPort, &BytesTransferred, (LPDWORD)&PerHandleData, (LPOVERLAPPED*)&PerIoData, INFINITE))
{
if( (GetLastError() == WAIT_TIMEOUT) || (GetLastError() == ERROR_NETNAME_DELETED) )
{
closesocket(PerHandleData->socket); delete PerIoData;
delete PerHandleData;
continue;
}
return 0;
} // 说明client已经退出
if(BytesTransferred == 0)
{
closesocket(PerHandleData->socket);
delete PerIoData;
delete PerHandleData;
continue;
}
if(PerIoData->OperationType==RECV_OPERATION)
{
printf("%d:%s\n",PerHandleData->Location,PerIoData->DataBuf.buf);
// 继续向 socket 投递WSARecv操作
DWORD Flags = 0;
DWORD dwRecv = 0;
ZeroMemory(PerIoData, sizeof(PER_IO_DATA));
PerIoData->DataBuf.buf = PerIoData->Buffer;
PerIoData->DataBuf.len = DATA_BUFFER;
PerIoData->OperationType=RECV_OPERATION;
WSARecv(PerHandleData->socket, &PerIoData->DataBuf, 1, &dwRecv, &Flags, &PerIoData->Overlapped, NULL);
}
} return 0;
} void main()
{
HANDLE ComplPort;
ComplPort=CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0); SYSTEM_INFO sysInfo;
memset(&sysInfo,0,sizeof(sysInfo));
GetSystemInfo(&sysInfo);
HANDLE *handleArray=(HANDLE *)malloc(sysInfo.dwNumberOfProcessors *sizeof(HANDLE));
for(int i=0;i<(sysInfo.dwNumberOfProcessors);i++)
{
handleArray[i]=(HANDLE)_beginthreadex(NULL,0,CompletionPortProcessor,ComplPort,0,NULL);
}
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData); SOCKET s,sClient;
struct addrinfo hints,*result;
int rc;
memset(&hints,0,sizeof(hints));
hints.ai_flags=AI_NUMERICHOST;//nodename is ip address;if set AI_PASSIVE ,it is computer name;if set AI_CANONNAME ,it is ..
hints.ai_family=AF_UNSPEC;//IPv4 OR IPv6;if IPv4,Set AF_INET; if IPv6,Set AF_INET6
hints.ai_socktype=SOCK_STREAM;//SOCK_DRGAM
hints.ai_protocol=IPPROTO_TCP;
rc=getaddrinfo("127.0.0.1","5001",&hints,&result);
s=socket(result->ai_family,result->ai_socktype,result->ai_protocol);
bind(s,result->ai_addr,result->ai_addrlen);
listen(s,5);
PER_IO_DATA *PerIoData;
PTR_HANDLE_DATA *PerHandleData;
int i=1;
while(true)
{
sClient = accept(s, 0,0);
PerHandleData = new PTR_HANDLE_DATA();
PerHandleData->socket = sClient;
PerHandleData->Location=i;
CreateIoCompletionPort((HANDLE)PerHandleData->socket, ComplPort, (DWORD)PerHandleData, 0); PerIoData = new PER_IO_DATA();
ZeroMemory(PerIoData, sizeof(PER_IO_DATA));
PerIoData->DataBuf.buf = PerIoData->Buffer;
PerIoData->DataBuf.len =DATA_BUFFER;
PerIoData->OperationType=RECV_OPERATION; DWORD Flags = 0;
DWORD dwRecv = 0;
WSARecv(PerHandleData->socket, &PerIoData->DataBuf, 1, &dwRecv, &Flags, &PerIoData->Overlapped, NULL);
i++;
} DWORD dwByteTrans;
PostQueuedCompletionStatus(ComplPort, dwByteTrans, 0, 0);
closesocket(s);
}
完毕port模型的更多相关文章
- Socket编程模型之完毕port模型
转载请注明来源:viewmode=contents">http://blog.csdn.net/caoshiying?viewmode=contents 一.回想重叠IO模型 用完毕例 ...
- 完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三
手把手叫你玩转网络编程系列之三 完毕port(Completion Port)具体解释 ...
- 服务器开发基础-Tcp/Ip网络模型—完成端口(Completion Port)模型
本文对于初学网络编程的极为友好,文中所有代码全部基于C语言实现,文中见解仅限于作者对于完成端口的初步认识,由于作者才疏学浅,出现的错误和纰漏,麻烦您一定要指出来,咱们共同进步.谢谢!!! 完成端口(c ...
- tflearn 在每一个epoch完毕保存模型
关键代码:tflearn.DNN(net, checkpoint_path='model_resnet_cifar10', max_checkpoints=10, tensorboard_verbos ...
- IOCP模型总结(总结回想)
IOCP旧代码重提.近期一直在玩其它方面的东东.时不时回想一下,收益多多. IOCP(I/O Completion Port,I/O完毕port)是性能最好的一种I/O模型.它是应用程序使用线程池处理 ...
- socket 由浅入深系列------ 原理(一)
来自:网络整理 个人觉得写一个网络应用程序没有是一件非常easy的事.其实,我们刚開始的时候总觉得的原则: 建立------>连接套接字------->接受一个连接---->发送数据 ...
- Cloud Foundry中DEA与warden通信完毕应用port监听
在Cloud Foundry v2版本号中,DEA为一个用户应用执行的控制模块,而应用的真正执行都是依附于warden. 更详细的来说,是DEA接收到Cloud Controller的请求:DEA发送 ...
- Linux下套接字具体解释(三)----几种套接字I/O模型
參考: 网络编程–IO模型演示样例 几种server端IO模型的简介及实现 背景知识 堵塞和非堵塞 对于一个套接字的 I/O通信,它会涉及到两个系统对象.一个是调用这个IO的进程或者线程,还有一个就是 ...
- WinSock IOCP 模型总结(附一个带缓存池的IOCP类)
前言 本文配套代码:https://github.com/TTGuoying/IOCPServer 由于篇幅原因,本文假设你已经熟悉了利用Socket进行TCP/IP编程的基本原理,并且也熟练的掌握了 ...
随机推荐
- P3387 【模板】缩点 tarjan
虽说是模板题,但是竟然中间有dp的部分...先tarjan缩点,重新建图.然后记忆化搜索,搜索dag中的最小环. 题干: 题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值, ...
- 84. ExtJS下页面显示中文乱码问题
转自:https://blog.csdn.net/wenminhao/article/details/51198981 最近在学校extjs是,使用js脚本显示中文在html页面中时,中午出现了乱码的 ...
- A Round Peg in a Ground Hole(圆与凸包)
http://poj.org/problem?id=1584 题意:判断所给的点能不能形成凸包,并判断所给的圆是否在凸包内. 改了好几天的一个题,今天才发现是输入顺序弄错了,办过的最脑残的事情..sa ...
- preg_replace数组的用法
$string = 'The quick brown fox jumped over the lazy dog.';$patterns = array();$patterns[2] = '/quick ...
- Y - Anton and Letters
Problem description Recently, Anton has found a set. The set consists of small English letters. Anto ...
- .net中的WebForm引人MVC的控制器
当下.net中比较火的模式MVC模式,说实话对于菜鸟的我还没有遇到一个比较健全的MVC模式的项目也是比较遗憾.偶然间在网上看到WebForm实现MVC中的模式(主要是控制器...)就学习了一波,下面是 ...
- supervisord 使用记录
#supervisor简介 Supervisor是一个 Python 开发的 client/server 系统,可以管理和监控类 UNIX 操作系统上面的进程. #组成部分 supervisord(s ...
- Java 8 新特性终极指南
1.前言 毫无疑问,Java 8的发布是自从Java5以来Java世界中最重大的事件,它在编译器.工具类和Java虚拟机等方面为Java语言带来的很多新特性.在本文中我们將一起关注下这些新变化,使用实 ...
- CXF-JAX-RS开发(一)入门案例
一.简介 资源驱动.基于HTTP协议[按照标准指定URL,就可以访问数据]以XML|JSON格式传输数据. 二.quickstart 1.创建maven project[Packaging:jar] ...
- MxNet : use the MxNet windows versioin
The MxNet needs the following thirdparties: 1. lapack complie lapack-3.6.1: download the lapack-3.6 ...