
Windows网络编程
加菲猫ooo
这个作者很懒,什么都没留下…
展开
-
IOCP网络模型基本步骤
一、定义结构 typedef struct PER_HANDLE_DATA { SOCKET s; SOCKADDR_IN RemoteAddr; }*PPER_HANDLE_DATA; typedef struct PER_IO_DATA { WSAOVERLAPPED ol; char buf[12转载 2012-10-07 13:53:37 · 574 阅读 · 0 评论 -
线程、线程句柄、线程id
什么是句柄: 句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满原创 2012-12-13 15:47:16 · 691 阅读 · 0 评论 -
IOCP一小例
完成端口模型可以让我们基于传递overlapped数据的思想分解异步操作,让操作系统帮我们做线程间的数据传递。基于这个思想,可以把bsdsocket改造成异步模型,尽管这样做效率上意义不大,但对于想模拟ms完成端口都网络模型的人来说,可以小圆梦想了。 [csharp] view plaincopyprint? static HANDLE g_hiocp;转载 2012-12-13 15:58:18 · 465 阅读 · 0 评论 -
完成端口cookbook
在服务器开发上虚度日月久矣,每次新的开发都要重新写一遍netlayer,厌烦了这种事情想做一个类库给自己的时候,一直使用完成端口做网络层没有错,但是不去深刻理解完成端口的本质就不对了,而且在该使用这个强力工具的时候没有想起使用却是大大的错了。 cookbook只讲step by step创建一个完成端口模块(网络)。 意识到线程切换的巨大代价,NT小组开发了完成端口这个内核级的东西。我转载 2012-12-13 15:55:50 · 480 阅读 · 0 评论 -
深入了解AS3 Socket 和TCP
磨刀不误砍柴工,让我们从概念入手,逐步深入。 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。Socket通讯是我们开发多人在线游戏中的常用通讯方式,它主要有流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)两种类别,AS3中我们一般使用的是基于TCP转载 2013-04-23 13:02:30 · 995 阅读 · 0 评论 -
详解大端模式和小端模式
详解大端模式和小端模式 一、大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋转载 2013-04-14 21:47:42 · 613 阅读 · 0 评论 -
WinSocket模型的探讨——Overlapped模型(一)
重叠模型是Windows里一种重要的 I/O 模型,可以有效率的实现一些 I/O 操作,譬如文件读写、Socket读写等,在这里我们一起来研究一下重叠模型,看看它究竟为何方神圣。 这篇文章分为以下几部分来说明: 重叠模型的概念容易碰到的一些问题重叠模型的基本编程方法(accept 和 AcceptEx )突破64个事件的等待限制例程 好了,下面就让我们一起来学习一下重叠模型。转载 2013-04-14 11:38:50 · 1045 阅读 · 0 评论 -
用于表示socket的结构体
用户使用socket系统调用编写应用程序时,通过一个数字来表示一个socket,所有的操作都在该数字上进行,这个数字称为套接字描述符。在系统调用的实现函数里,这个数字就会被映射成一个表示socket的结构体,该结构体保存了该socket的所有属性和数据。在内核的协议中实现中,关于表示socket的结构体,是一个比较复杂的东西,下面一一介绍。 struct socket。 这是一转载 2013-04-18 21:57:02 · 579 阅读 · 0 评论 -
深度探索套接字缓冲区(1)
套接字缓冲区用结构体struct sk_buff表示,它用于在网络子系统中的各层之间传递数据,处于一个核心地位,非常之重要。它包含了一组成员数据用于承载网络数据,同时,也定义了在这些数据上操作的一组函数。下面是其完整的定义: struct sk_buff { struct sk_buff *next; struct sk_buff转载 2013-04-18 22:03:25 · 667 阅读 · 0 评论 -
线程与线程回调函数
本来回调与线程之间没多大关系,只是线程是采用回调的方式来执行你的代码,这个是它们之间存在的一点联系。 回调函数: 一般用于模块解耦,提供功能扩展用。 要清楚的认识回调函数,需要分清这两者,调用方(即接口声明方)、(即被调用方)实现方。 事实上回调函数无处不再,控制台中的main、WIN32中的WinMain、WINDRV中的DriverEntry都是回调函数,所以你会发现回调函数的原型转载 2012-11-05 14:38:42 · 11026 阅读 · 0 评论 -
IOCP中多次投递WSASend
关于IOCP中是否可以对同一socket连续投递的疑问已经很久了,主要的疑问在wsaSend是否可以保证数据的完整发送,是否会出现部分发送成功的情况? 网上大多数的建议都是WSASEND采用线性模式,即建立一个发送缓冲,当上一次send完成之后,再进行下一次的投递。那么WSASEND什么情况下会出现部分发送呢? 在MSDN中IOCP的列子是对得到的发送的字节值进行了判断的转载 2012-10-06 22:58:47 · 6158 阅读 · 2 评论 -
WinSock完成端口I/O模型
关于重叠I/O,参考《WinSock重叠I/O模型》;关于完成端口的概念及内部机制,参考译文《深度探索I/O完成端口》。 完成端口对象取代了WSAAsyncSelect中的消息驱动和WSAEventSelect中的事件对象,当然完成端口模型的内部机制要比WSAAsyncSelect和WSAEventSelect模型复杂得多。 IOCP内部机制如下图所示: 在WinSock中编写完成转载 2012-09-27 19:25:32 · 1877 阅读 · 0 评论 -
深度探索I/O完成端口
引言 要想编写一个高性能的服务器应用程序,必须实现一个高效的线程模型。让太少或者太多的服务器线程来处理客户的请求,都可能导致性能问题。例如,如果一个服务器创建单个线程来处理所有的请求,那么客户端可能长期等待而得不到响应,因为服务器同一时刻只能忙于处理一个请求。当然单个线程也能并发处理多个请求,当I/O操作被启动时,它可以从一个请求切换到另一个请求,但是这种结构相当复杂,并且不能充分利用多处理器的转载 2012-09-27 19:24:23 · 1570 阅读 · 0 评论 -
WinSock重叠I/O模型
一.重叠I/O模型的概念 当调用ReadFile()和WriteFile()时,如果最后一个参数lpOverlapped设置为NULL,那么线程就阻塞在这里,直到读写完指定的数据后,它们才返回。这样在读写大文件的时候,很多时间都浪费在等待ReadFile()和WriteFile()的返回上面。如果ReadFile()和WriteFile()是往管道里读写数据,那么有可能阻塞得更久,导致程序性能下转载 2012-09-27 19:19:53 · 1775 阅读 · 0 评论 -
Windows下重叠I/O模型
一.重叠模型的优点 1.可以运行在支持Winsock2的所有Windows平台 ,而不像完成端口只是支持NT系统。 2.比起阻塞、select、WSAAsyncSelect以及WSAEventSelect等模型,重叠I/O(Overlapped I/O)模型使应用程序能达到更佳的系统性能。 因为它和这4种模型不同的是,使用重叠模型的应用程序通知缓冲区收发系统直接使用数据,转载 2012-10-07 15:37:43 · 1257 阅读 · 0 评论 -
IOCP原理
要想彻底征服IOCP,并应用好IOCP这个模型,首先就让我们穿越到遥远的计算机青铜器时 代(以出现PC为标志),那时候普通的PC安装的还是DOS平台,微软公司主要靠这个操作系统在IT界的原始丛林中打拼,在DOS中编写程序,不得不与很 多的硬件直接打交道,而最常操作的硬件无非是键盘、声显卡、硬盘等等,这些设备都有一个特点就是速度慢,当然是相对于PC平台核心CPU的速度而言,尤其 是硬盘这个机械电子设原创 2012-09-28 14:21:30 · 4162 阅读 · 0 评论 -
Windows I/O完成端口
Windows I/O完成端口 WINDOWS完成端口编程 1、基本概念 2、WINDOWS完成端口的特点 3、完成端口(Completion Ports )相关数据结构和创建 4、完成端口线程的工作原理 5、Windows完成端口的实例代码 WINDOWS完成端口编程 摘要:开发网络程序从来都不是一件容易的事情,尽管只需要遵守很少的一些规则:创建socket,发起连接,转载 2012-10-06 21:52:07 · 1654 阅读 · 0 评论 -
完成端口例程
来自微软的完成端口例子,就讲解一下它的使用套路吧 反正编程这个玩意,只要用过,自然就知道什么回事,一次不会再看一次,学习这个玩意,无他,勤奋而已。 奢谈效率等等,那只是孰能生巧上的功夫。 这个例子是在console下的例子,算是一个echo服务器吧, 跑起来后将在5150端口监听,一旦有个端口连接上来,发个数据给服务端口,它就echo回数据给那个端口. 直到那个连接中断.转载 2012-10-07 16:00:54 · 552 阅读 · 0 评论 -
epoll和iocp的异同之处
昨天面试题,谈谈linux下的epoll模式和windows下的iocp模式的异同。 相同的地方: 两者都是处理异步IO的高效模型,这种高效,除了“异步处理”这个一起的特征之外,二者都能通过指针携带应用层数据:在IOCP里,应用层数据能通过单句柄数据和单IO数据来和IOCP底层通信;而在epoll里,能通过epoll_data里的"void *ptr"来传递。这是一种非常重要的思想,也是他转载 2012-10-09 14:59:30 · 716 阅读 · 0 评论 -
深度探索套接字缓冲区(2)
前面一篇文章分析了套接字缓冲区sk_buff的创建过程,但一般来讲,一个套接字缓冲区总是属于一个套接字,所以,除了调用sk_buff本身的alloc_skb函数创建一个套接字缓冲区,套接字本身还要对sk_buff进行一些操作,以及设置自身的一些成员值。下面我们来分析这个过程。 如果检查到待发送数据报没有传输层协议头(不是传输层的tcp或udp数据报),套接字创建缓冲区的函数是sock_a转载 2013-04-18 22:04:03 · 794 阅读 · 0 评论