前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >重叠(Overlapped)IO模型

重叠(Overlapped)IO模型

作者头像
用户1154259
发布于 2018-01-17 06:52:12
发布于 2018-01-17 06:52:12
2K00
代码可运行
举报
运行总次数:0
代码可运行

基本思想:允许应用程序使用重叠数据结构一次投递一个或者多个异步IO请求。

提交IO请求完成后,与之关联的重叠数据结构中的事件对象受信,应用程序便可使用WSAVerlappedResult函数获取重叠操作结果。

1创建数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SOCKET sListen = ::WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,

                NULL,0,WSA_FLAG_OVERLAPPED);

2传输数据:WSASend WSARecv(tcp)     WSASendTo WSARecvFrom

  应用程序两种方法接收到重叠IO请求操作完成的通知:

    1) 与WSAOVERLAPPED结构关联的事件对象上等待,IO操作完成后,事件受信

    2) 使用lpCompetionRoutine只想完成例程

3 接受连接: AcceptEx,接受新的连接,返回本地和远程地址,取得客户程序发送的第一块数据

  如果投递的请求成功完成:则发生下面3个动作:

    1) 接受了新的连接

    2) 新连接的本地地址和远程地址都会返回

    3) 接收到了远程主机发来的第一块数据

为了直接调用AcceptEx而不是用Mswsock.lib库,需要使用WSAIcotl函数将AcceptEx函数加载到内存,记载AcceptEx函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GUID GuidAcceptEx = WSAID_ACCEPTEX;
DWORD dwBytes;
WSAIotcl(
         pListen->s,
         SIO_GET_EXTENSION_FUNCTION_POINTER,
         &GuidAcceptEx,
         sizeof(GuidAcceptEx),
         &pListen->lpfnAcceptEx,
         sizeof(pListen->lpfnAcceptEx),
         &dwBytes,
         NULL,
         NULL
         );
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012-10-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
c++ accept_怎么把汇编语言转化为c语言
参数1–sListenSocket, accept前绑定到本地地址的监听socket,一般由listen()得到
全栈程序员站长
2022/11/10
2.7K0
accept函数的用法_requestscope用法
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/10
3.3K0
完成端口与线程池的关系_端口触发
关于IOCP网上到处都是资料,说的也很详细。我在这里就不再多说了,这只是本人在学习IOCP时的笔记,和配合AcceptEx写的一个极小的服务端程序。由于刚刚接触ICOP加上本人刚毕业不到一年,所以里面的理解或观点可能有误,还请大家多多批评!
全栈程序员站长
2022/11/11
9610
完成端口与线程池的关系_端口触发
accept 函数_case when函数
  使用此函数时,要包含头文:Mswsock.h,同时要链接:Mswsock.lib。可在源程序中加入下面的语句,这样在编译时,将自动链接Mswsock.lib。
全栈程序员站长
2022/11/10
8200
c++ 网络编程(十)TCP/IP LINUX/windows 异步通知I/O模型与重叠I/O模型 附带示例代码
原文链接:https://www.cnblogs.com/DOMLX/p/9662931.html
徐飞机
2018/09/30
1.6K0
c++ 网络编程(十)TCP/IP LINUX/windows    异步通知I/O模型与重叠I/O模型  附带示例代码
关于windows完成端口(IOCP)的一些理解(一)
系列目录 关于windows完成端口(IOCP)的一些理解(一) 关于windows完成端口(IOCP)的一些理解(二) 关于windows完成端口(IOCP)的一些理解(三) 关于windows完成端口(IOCP)的一些理解(四) 关于windows完成端口(IOCP)的一些理解(五) 关于windows完成端口(IOCP)的一些理解(六) 本人很多年前接触完成端口以来,期间学习和练习了很多次,本以为自己真正地理解了其原理,最近在看网狐的服务器端源码时又再一次拾起完成端口的知识,结果发现以前理解的其实很多
范蠡
2018/04/13
7.4K0
IOCP使用acceptEX进行异步接收
代码部分疑惑说明 说明:①WSAAcceptEx函数作用是投递accept操作到完成端口内核,只有该函数可以完成此功能
全栈程序员站长
2022/11/11
7670
开启服务和停止服务
Start函数用于开启服务 1 初始化状态变量 2 创建监听套接字 3 加载使用扩展API函数 4 创建完成端口对象 5 建立监听套接字和完成端口对象间的关联 6 为监听套接字注册FD_ACCEPT时间 7 投递AcceptEx IO不够时可以得到通知后创建监听线程 BOOL CIOCOPServer::Start(int nPort,int nMaxConnnections,int nMaxFreeBuffers,int nMaxFreeContexts,int nInitialReads) {
用户1154259
2018/01/17
1.8K0
iocp详解_iocp是异步io吗
大家好,又见面了,我是你们的朋友全栈君。 #include “SOCKET.h” #include <Windows.h> DWORD WINAPI ThreadProc(LPVOID pvParam); #define PORT 8080 #define LISTEN_QUEUE 200 // AcceptEx 和 GetAcceptExSockaddrs 的函数指针,用于调用这两个扩展函数 LPFN_ACCEPTEX lpfnAcceptEx; LPFN_GETACCEPTEXSOCKADDRS lpfnGetAcceptExSockAddrs; void PostAcceptEx(IOCPHandle_s & listenHandle) { IO_DATA_s * p_io_data = new IO_DATA_s; p_io_data->socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); listenHandle.Push(p_io_data); p_io_data->type = ACCEPT; lpfnAcceptEx(listenHandle.socket, p_io_data->socket, &p_io_data->addr, 0, 0, sizeof(SOCKADDR_IN) + 16, &p_io_data->len, &p_io_data->ol); } int main() { SocketInit(); IOCPHandle_s listenHandle; listenHandle.socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); listenHandle.addr.sin_family = AF_INET; listenHandle.addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); listenHandle.addr.sin_port = htons(PORT); HANDLE IOCPhandle; IOCPhandle = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0 ); ::CreateThread(0, 0, ThreadProc, (void *)IOCPhandle, 0, 0); ::bind(listenHandle.socket, (SOCKADDR *)&listenHandle.addr, sizeof(SOCKADDR)); ::listen(listenHandle.socket, LISTEN_QUEUE); CreateIoCompletionPort((HANDLE)listenHandle.socket, IOCPhandle, (unsigned long)&listenHandle, 0); // 使用AcceptEx函数,因为这个是属于WinSock2规范之外的微软另外提供的扩展函数 // 所以需要额外获取一下函数的指针, // 获取AcceptEx函数指针 GUID GuidAcceptEx = WSAID_ACCEPTEX; GUID GuidGetAcceptExSockAddrs = WSAID_GETACCEPTEXSOCKADDRS; DWORD dwBytes = 0; WSAIoctl( listenHandle.socket, SIO_GET_EXTENSION_FUNCTION_POINTER, &GuidAcceptEx, sizeof(GuidAcceptEx), &lpfnAcceptEx, sizeof(lpfnAcceptEx), &dwBytes, NULL, NULL); // 获取GetAcceptExSockAddrs函数指针,也是同理 WSAIoctl( listenHandle.socket, SIO_GET_EXTENSION_FUNCTION_POINTER, &GuidGetAcceptExSockAddrs, sizeof(GuidGetAcceptExSockAddrs), &lpfnGetAcceptExSockAddrs, sizeof(lpfnGetAcceptExSockAddrs),
全栈程序员站长
2022/11/10
3700
如何产生ioexception_结合实例论述控制过程
在普通IOCP的基础上注意两点: 1.记得把监听socket绑定到端口 2.在Accept处理过程中,抛出接受连接的AcceptEx请求,绑定客户端socket到端口和抛出recv请求
全栈程序员站长
2022/11/11
3990
关于access字段名,下面叙述错误的是_accepted是什么意思
GetQueuedCompletionStatus 将携带返回2个重要的参数, 一个lpCompletionKey, 一个lpOverlapped.
全栈程序员站长
2022/11/11
6290
windows完成端口(五)
系列目录 windows完成端口(一) windows完成端口(二) windows完成端口(三) windows完成端口(四) windows完成端口(五) windows完成端口(六) #include "StdAfx.h" #include "IOCPModel.h" #include "MainDlg.h" // 每一个处理器上产生多少个线程(为了最大限度的提升服务器性能,详见配套文档) #define WORKER_THREADS_PER_PROCESSOR 2 // 同时投
范蠡
2018/04/24
1.9K0
基于重叠IO模型的 回显TCP服务器设计
---------------------1 套接字对象---------------------- 为每个套接字创建一个SOCKET_OBJ对象,记录与之相关的信息。 typedef struct _SOCKET_OBJ{ SOCKET s; int nOutstandingOps;//重叠IO数量 LPFN_ACCEPTEX lpfnAcceptEx; //扩展AcceptEx指针 }SOCKET_OBJ,*PSOCKET_OBJ; 所有重叠IO提交到特定的套接字上,释放对应套
用户1154259
2018/01/17
1.1K0
WinSock 重叠IO模型
title: WinSock 重叠IO模型 tags: [WinSock 模型, 网络编程, 重叠IO模型] date: 2018-06-29 20:26:13 categories: Windows 网络编程 keywords: WinSock 模型, 网络编程, 重叠IO模型 --- 之前介绍的WSAAsyncSelect和WSAEvent模型解决了收发数据的时机问题,但是网卡这种设备相比于CPU和内存来说仍然是慢速设备,而调用send和recv进行数据收发操作仍然是同步的操作,即使我们能够在恰当的时机调用对应的函数进行收发操作,但是仍然需要快速的CPU等待慢速的网卡。这样仍然存在等待的问题,这篇博文介绍的重叠IO模型将解决这个等待的问题
Masimaro
2018/08/31
1.9K0
完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三
----- By PiggyXP(小猪)
战神伽罗
2019/07/24
9262
关于windows完成端口(IOCP)的一些理解(五)
系列目录 关于windows完成端口(IOCP)的一些理解(一) 关于windows完成端口(IOCP)的一些理解(二) 关于windows完成端口(IOCP)的一些理解(三) 关于windows完成端口(IOCP)的一些理解(四) 关于windows完成端口(IOCP)的一些理解(五) 关于windows完成端口(IOCP)的一些理解(六) #include "StdAfx.h" #include "IOCPModel.h" #include "MainDlg.h" // 每一个处理器上产生
范蠡
2018/04/18
1.9K0
WinSock Socket 池
之前在WinSock2.0 API 中说到,像DisConnectEx 函数这样,它具有回收SOCKET的功能,而像AcceptEx这样的函数,它不会自己在内部创建新的SOCKET,需要外部传入SOCKET作为传输数据用的SOCEKT,使用这两个函数,我们可以做到,事先创建大量的SOCKET,然后使用AcceptEx函数从创建的SOCKET中选择一个作为连接用的SOCKET,在不用这个SOCKET的时候使用DisConnectEx回收。这样的功能就是一个SOCKET池的功能。
Masimaro
2018/08/31
1.2K0
WinSock2 API
title: WinSock2 API tags: [WinSock, 网络编程, WinSock2.0 API, 动态加载, WinSock 异步函数] date: 2018-07-21 10:36:09 categories: Windows 网络编程 keywords: WinSock, 网络编程, WinSock2.0 API, 动态加载, WinSock 异步函数 --- WinSock中提供的5种网络模型已经可以做到很高效了,特别是完成端口,它的高效的原因在于它不仅另外开启了线程来处理完成通知而不是占用主程序的时间,同时也在于我们在完成端口中运用了大量异步IO处理函数。比如WSASend、WSARecv等等。为了高效的处理网络IO,WinSock提供了大量这样的异步函数。这篇博文主要探讨这些函数的用法和他们与传统的巴克利套接字相比更加高效的秘密
Masimaro
2018/08/31
1.2K0
WinSock2 API
关于windows完成端口(IOCP)的一些理解(二)
1 不知道你是否记得前面中说过每消耗一个预先准备客户端的socket,就要补上一个。这个代码现在看来就应该放在连接成功事件里面了: DWORD ThreadFunction() { OVERLAPPED *pOverlapped = NULL; PER_SOCKET_CONTEXT *pSocketContext = NULL; DWORD dwBytesTransfered = 0; BOOL bR
范蠡
2018/04/13
1.6K0
windows完成端口(二)
系列目录 windows完成端口(一) windows完成端口(二) windows完成端口(三) windows完成端口(四) windows完成端口(五) windows完成端口(六) 1 不知道你是否记得前面中说过每消耗一个预先准备客户端的socket,就要补上一个。这个代码现在看来就应该放在连接成功事件里面了: DWORD ThreadFunction() { OVERLAPPED *pOverlapped = NULL; PER_SOCKET_CON
范蠡
2018/04/24
1.7K0
相关推荐
c++ accept_怎么把汇编语言转化为c语言
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档