热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

转发:IOCP模型示例代码

#include#include#include#includeusingnamespace

#include
#include
#include
#include using namespace std;#pragma comment(lib, "ws2_32.lib") //socket动态链接库
#pragma comment(lib, "kernel32.lib") //IOCP动态链接库//重叠IO用到的结构体,记录IO数据const int DataBufferSize = 2* 1024;
typedef struct s1
{OVERLAPPED overlapped;WSABUF databuff;char cBuffer[DataBufferSize];int BufferLen;int OperationType;}PER_IO_DATA, *LPPER_IO_DATA;//记录每个连接的socket信息
typedef struct
{SOCKET socket;SOCKADDR_STORAGE clientAddr;
}PER_HANDLE_DATA, * LPPER_HANDLE_DATA;//定义全局变量
const int nDefaultPort = 6000;
vector g_vClientGroup;//记录客户端的容器HANDLE hMutex = CreateMutex(NULL, FALSE, NULL);DWORD WINAPI ServerWorkThread(LPVOID CompletionPortID);
DWORD WINAPI ServerSendThread(LPVOID lpParam);int main()
{WORD wVersionRequested &#61; MAKEWORD(2,2);//请求版本为2.2的WINSOCKET库WSADATA wsaData; //接收windows socket的结构信息DWORD err &#61; WSAStartup(wVersionRequested, &wsaData);if(0 !&#61; err){cout<<"Request Windows Socket Library Error!"<socket &#61; acceptSocket;memcpy(&lpPer_Handle_Data->clientAddr, &sockaddr_client, nsocketaddr_client);g_vClientGroup.push_back(lpPer_Handle_Data);//将接收套接字和完成端口关联CreateIoCompletionPort((HANDLE)(lpPer_Handle_Data->socket), completionPort, (DWORD)lpPer_Handle_Data, 0);LPPER_IO_DATA perIoData &#61; NULL;memset(perIoData, 0, sizeof(struct s1));//perIoData &#61; (LPPER_IO_DATA)GlobalAlloc(GPTR, sizeof(PER_IO_DATA));//perIoData &#61; new PER_IO_DATA;//ZeroMemory(&(perIoData->overlapped), sizeof(OVERLAPPED));perIoData->databuff.len &#61; 1024;perIoData->databuff.buf &#61; perIoData->cBuffer;perIoData->OperationType &#61; 0; //readDWORD RecvBytes;DWORD Flags &#61; 0;WSARecv(lpPer_Handle_Data->socket, &(perIoData->databuff), 1, &RecvBytes, &Flags, &(perIoData->overlapped), NULL);}return 0;
}//开始服务器工作线程函数
DWORD WINAPI ServerWorkThread(LPVOID IpParam)
{HANDLE CompletionPort &#61; (HANDLE)IpParam;DWORD BytesTransferred;LPOVERLAPPED IpOverlapped;LPPER_HANDLE_DATA PerHandleData &#61; NULL;LPPER_IO_DATA lpPerIoData &#61; NULL;DWORD RecvBytes;DWORD Flags &#61; 0;BOOL bRet &#61; false;while(true){bRet &#61; GetQueuedCompletionStatus(CompletionPort, &BytesTransferred, (PULONG_PTR)&PerHandleData, (LPOVERLAPPED *)&IpOverlapped, INFINITE);if(bRet &#61;&#61; 0){cout<<"GetQueuedCompletionStatus Error:"<socket);GlobalFree(PerHandleData);GlobalFree(lpPerIoData);continue;}//开始数据处理&#xff0c;接收来至客户端的数据WaitForSingleObject(hMutex, INFINITE);cout<<"A Client says:"<databuff.buf<overlapped), sizeof(OVERLAPPED)); //清空内存lpPerIoData->databuff.len &#61; 1024;lpPerIoData->databuff.buf &#61; lpPerIoData->cBuffer;lpPerIoData->OperationType &#61; 0;WSARecv(PerHandleData->socket, &(lpPerIoData->databuff), 1, &RecvBytes, &Flags, &(lpPerIoData->overlapped), NULL);}return 0;
}DWORD WINAPI ServerSendThread(LPVOID IpParam)
{while(true){char talk[200]&#61;{0x00};gets(talk);int len;for(len&#61;0; talk[len] !&#61; &#39;\0&#39;; &#43;&#43;len){}talk[len]&#61;&#39;\n&#39;;talk[&#43;&#43;len] &#61; &#39;\0&#39;;cout<<"I Say :";cout<socket, talk, 200, 0);}ReleaseMutex(hMutex);}return 0;
}

 


推荐阅读
  • PBO(PixelBufferObject),将像素数据存储在显存中。优点:1、快速的像素数据传递,它采用了一种叫DMA(DirectM ... [详细]
  • 在iOS开发中,多线程技术的应用非常广泛,能够高效地执行多个调度任务。本文将重点介绍GCD(Grand Central Dispatch)在多线程开发中的应用,包括其函数和队列的实现细节。 ... [详细]
  • iOS snow animation
    CTSnowAnimationView.hCTMyCtripCreatedbyalexon1614.Copyright©2016年ctrip.Allrightsreserved.# ... [详细]
  • 本文介绍了如何使用线段树实现区间加法和区间查询操作,包括详细的代码实现和解释。 ... [详细]
  • 用C语言实现的科学计算器,支持2种常量,10种基本函数,Ans寄存器。相对来说拓展性应该是不错的,思路是首先化简复杂名称的函 ... [详细]
  • 线段树,注 ... [详细]
  • C语言是计算机科学和编程领域的基石,许多初学者在学习过程中会感到困惑。本文将详细介绍C语言的基本概念、关键语法和实用示例,帮助你快速上手C语言。 ... [详细]
  • 本文介绍了 Oracle SQL 中的集合运算、子查询、数据处理、表的创建与管理等内容。包括查询部门号为10和20的员工信息、使用集合运算、子查询的注意事项、数据插入与删除、表的创建与修改等。 ... [详细]
  • 开发笔记:树的浅析与实现 ... [详细]
  • hdu4539郑厂长系列故事——排兵布阵http:acm.hdu.edu.cnshowproblem.php?pid4539问题描述:给你一个n行m列的0-1矩阵,0表示不 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 【线段树】  本质是二叉树,每个节点表示一个区间[L,R],设m(R-L+1)2(该处结果向下取整)左孩子区间为[L,m],右孩子区间为[m ... [详细]
  • PHP 5.5.31 和 PHP 5.6.17 安全更新发布
    PHP 5.5.31 和 PHP 5.6.17 已正式发布,主要包含多个安全修复。强烈建议所有用户尽快升级至最新版本以确保系统安全。 ... [详细]
  • 本文将深入探讨 iOS 中的 Grand Central Dispatch (GCD),并介绍如何利用 GCD 进行高效多线程编程。如果你对线程的基本概念还不熟悉,建议先阅读相关基础资料。 ... [详细]
  • T15483.【清华集训2017模拟11.26】简单路径T25484.【清华集训2017模拟11.26】快乐树T35485.【清华集训2017模拟11.26】字符串T1结论题,结论很 ... [详细]
author-avatar
桃Z夭夭
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有