Windows 网络编程(2)--重叠I/0模型

5).重叠I/O模式(overlapped)

常用函素:

1.WSASocket : 创建套接字

2.TCP

WSASend

WSARecv

3.UDP:

WSASendTo

WSARecvFrom

4.AccepEx (Mswsock.lib库导出)

WSAIoctl

5.数据类型

WSAOVERLAPPED (wsaoverlapped)

函数: WSAGetOverlappedResult

使用:

缓冲区对象

typedef struct _BUFFER_OBJ
{
    OVERLAPPED     ol;          // 重叠结构
    char     *buff;             // send/recv/AcceptEx所使用的缓冲区
    int nLen;               // buff的长度
    PSOCKET_OBJ pSocket;    // 此I/O所属的套节字对象
    int nOperation;         // 提交的操作类型
 #define OP_ACCEPT  1
 #define OP_READ        2
 #define OP_WRITE   3

    SOCKET sAccept;         // 用来保存AcceptEx接受的客户套节字(仅对监听套节字而言)
    _BUFFER_OBJ *pNext;
} BUFFER_OBJ, *PBUFFER_OBJ;

1.定义全局数据

HANDLE g_events[WSA_MAXIMUM_WAIT_EVENTS]; // I/O事件句柄数组

int g_nBufferCount; // 上数组中有效句柄数量

PBUFFER_OBJ g_pBufferHead, g_pBufferTail; // 记录缓冲区对象组成的表的地址

2.申请缓冲区

PBUFFER_OBJ GetBufferObj(PSOCKET_OBJ pSocket, ULONG nLen)

3. 释放缓冲区

void FreeBufferObj(PBUFFER_OBJ pBuffer)

4.根据受信事件对象的句柄,查找对应的BUFFER_OBJ

PBUFFER_OBJ FindBufferObj(HANDLE hEvent)

5.更新事件句柄数组g_events

void RebuildArray()

6.接收发送

接收连接的BUFFER_OBJ对象.使用的函数: PostAccept

接收数据的BUFFER_OBJ对象.使用的函数: PostRecv

发送数据的BUFFER_OBJ对象.使用的函数: PostSend

实现步骤:

1. 设置I/O类型,增加套节字上的重叠I/O计数

2. 投递此重叠I/O

7.I/O请求完成之后, 处理它的函数是HandleI/O

8.main主函数

a)创建监听套接字.投递监听I/0

b)循环处理I/0事件

整理自(Windows网络与通信程序设计, 王艳平)

代码地址: http://download.csdn.net/detail/zhaoyc_59211/192329

时间: 2024-10-13 17:37:34

Windows 网络编程(2)--重叠I/0模型的相关文章

Windows网络编程--选择(select)模型

选择模型是I/O模型中最简单的一个.Server端通过创建两个套接字集合fdOld和fdNew,在循环中通过事件添加和移除未决IO套接字句柄.测试的时候先启动服务端再启动客户端. 以下为Server端源代码(在VS2010下测试通过): #include "stdafx.h"#include<WinSock2.h>#include<Windows.h> #include<iostream> #pragma comment(lib,"ws2_

Windows网络编程

第一章 序言 我写这个专题的目的,一方面是为了通过对网络编程再一次系统的总结,提高自己的网络编程水平,特别是Windows下的网络编程水平.同一时候,我也希望,能为众多初学网络编程的人提供一点帮助,由于我開始学习网络编程的时候,能找到的资料就非常少.当然,花钱能够买到翻译版本号的书:) 首先向大家推荐一本非常好的參考书,Network Programming for Microsoft Windows 2nd, 初学网络编程的时候我还不知道有这样一本好书,仅仅是上各大论坛把能找到的网络编程方面的

Windows网络编程 2 【转】

Windows网络编程使用winsock.Winsock是一个基于Socket模型的API,在Windows系统中广泛使用.使用Winsock进行网络编程需要包含头文件Winsock2.h,需要使用库ws2_32.lib,包含方法:可以使用语句来告诉编译器连接该库#pragma comment(lib, “ws2_32.lib”);如果使用VS,可以通过“项目” --> “XX属性”--> “连接器”-->“输入”--> “附加依赖项”添加ws2_32.lib. (XX为当前工程名

C# 网络编程之豆瓣OAuth2.0认证详解和遇到的各种问题及解决

        最近在帮人弄一个豆瓣API应用,在豆瓣的OAuth2.0认证过程中遇到了各种问题,同时自己需要一个个的尝试与解决,最终完成了豆瓣API的访问.作者这里就不再吐槽豆瓣的认证文档了,毕竟人家也不容易.但是作者发现关于豆瓣OAuth认证过程的文章非常之少,所以想详细写这样一篇文章方便后面要做同样东西的人阅读.希望文章对大家有所帮助,尤其是想做豆瓣API开发的初学者. (文章中蓝色字表示官方文档引用,红色字是可能遇到问题及注意,黑色字是作者叙述) 一.误区OAuth1.0认证过程    

Windows网络编程经验小结

转自:CSDN网友的强贴,其ID:gdy119 (夜风微凉) 1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket: BOOL bReuseaddr=TRUE; setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL)); 2. 如果要已经处于连接状态的soket

C# 网络编程之豆瓣OAuth2.0认证具体解释和遇到的各种问题及解决

        近期在帮人弄一个豆瓣API应用,在豆瓣的OAuth2.0认证过程中遇到了各种问题,同一时候自己须要一个个的尝试与解决,终于完毕了豆瓣API的訪问.作者这里就不再吐槽豆瓣的认证文档了,毕竟人家也不easy.可是作者发现关于豆瓣OAuth认证过程的文章很之少,所以想具体写这样一篇文章方便后面要做相同东西的人阅读.希望文章对大家有所帮助,尤其是想做豆瓣API开发的刚開始学习的人. (文章中蓝色字表示官方文档引用,红色字是可能遇到问题及注意,黑色字是作者叙述) 一.误区OAuth1.0认

windows网络编程的一些理论

参考自<VC++深入详解> 这是我在看书时记录下来的东西. 注:下面的Socket其实都应该是socket 第14章网络编程 Socket是连接应用程序与网络驱动程序的桥梁,Socket在应用程序中创建,通过绑定与驱动程序建立关系. 此后,应用程序给Socket的数据,由Socket交给驱动程序向网络上发送出去. 计算机从网络上收到与该Socket绑定的IP地址和端口号相关的数据后,由驱动程序交给Socket,应用程序便可从该Socket中提取接收到的数据. 14.1 计算机网络基本知识. 1

72&gt;&gt;Windows 网络编程

1 网络编程 API 2 3 4 int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData ); lpWSAData 是一个返回值:成功返回 0,失败返回 -1,错误代码 WSASYSNOTREADY 表示基础网络子系统没有准备好网络通行,WSAVERNOTSUPPORTED 表示 Socket 版本不支持,WSAEINPROGRESS 表示一个阻塞的 Sockets 操作在进程中,WSAEPROCLIM 表示 Sockets 支持的

windows 网络编程[转]

利用winsock编写网络应用程序服务端的步骤简述如下WSAStartup 初始化网络编程库 socket 创建套接字 bind 指定地址.端口,绑定套接字 listen 进入监听状态 accept 等待接收新连接 send/recv 收发数据 closesocket 关键套接字 WSAStartup 释放对动态库的使用 下面详细介绍各API 1. Winsock初始化 调用int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData