摘要:
对于开发一款高性能服务器程序,广大服务器开发人员在一直为之奋斗和努力.其中一个影响服务器的重要瓶颈就是服务器的网络处理模块.如果一款服务器程序不能及时的处理用户的数据.则服务器的上层业务逻辑再高效也是徒劳.所以一个服务器程序的网络处理能力直接影响到整个服务器的性能,本文主要介绍在windows平台下开发高性能的网络处理模块以及自己在设计开发服务器网络模块遇到的一些问题和开发心得.本篇主要介绍TCP服务器的设计,下一篇将主要介绍UDP服务器的设计.众所周知,对于服务器来说windows下网络I/O处理的最佳方式就是完成端口,因此本服务器的开发主要基于完成端口的模式.完成端口(completion 阅读全文
摘要:
本章我将谈谈如何开发一个高性能的UDP服务器的网络层.UDP服务器的网络层开发相对与TCP服务器来说要容易和简单的多,UDP服务器的大致流程为创建一个socket然后将其绑定到完成端口上并投递一定数量的recv操作.当有数据到来时从完成队列中取出数据发送到接收队列中即可。 测试结果如下:WindowsXP Professional,Intel Core Duo E4600 双核2.4G , 2G内存。同时30K个用户和该UDP服务器进行交互其CPU使用率为10%左右,内存占用7M左右。 下面详细介绍该服务器的架构及流程:1. 首先介绍服务器的接收和发送缓存UDP_CONTEXT。class U 阅读全文
摘要:
对于实时传输(在这里实时传输主要指交互式视音频,例如视频会议,IM视音频对话等等)来说,数据量有以下两个特点:1.数据是即时产生的,并即时发送,如果数据不能在一个给定的期限内发送完毕,则这部分数据将被丢弃。2.一般来说,单位时间内传输的数据流量比较平滑。TCP依赖滑动窗口进行流量控制,滑动窗口大小是自适应的,影响滑动窗口主要有两个因素,一是网络延时,二是传输速率,滑动窗口的大小与延时成正比,与传输速率也成正比。在给定的网络环境下,延时可以认为是固定的,因此滑动窗口仅与传输速率有关,当传输实时数据时,因为数据流通量比较固定,所以这时TCP上的滑动窗口会处于一个不大不小的固定值,这个值大小恰好保证 阅读全文
摘要:
误区一,使用send函数发送数据一些人使用阻塞的send函数发送数据,这是绝对应该避免的,一旦某一个连接传输发生拥塞,或者突然中断而没有通知,调用send函数的线程将可能被阻塞很长一段时间(可能10秒或更长),尤其是当服务器同时处理成千上万个连接时,这种情况可能会频繁出现。使用非阻塞的send也不适合,数据不一定每次都能完全发送出去,你得使用select跟踪这些socket的发送状态(一旦可能,发送剩余数据),这失去了IOCP的优势。误区二,在多个工作线程的情况下使用PostQueuedCompletionStatus使用PostQueuedCompletionStatus向IOCP发送一个“ 阅读全文
摘要:
及时监测连接被动关闭除非有特别要求,否则你应该总是对每个连接保持一个挂起的接收pending io(使用WSARecv投递)。如果用户主动关闭连接,你的GetQueuedCompletionStatus调用将返回成功,但接收到的数据长度为0,你能根据这点检测连接是否已被对方关闭。如果连接被重置或者io被取消(如果你调用了CancelIo的话),GetQueuedCompletionStatus将返回失败,注意这时还应该判断GetQueuedCompletionStatus调用返回的lpOverlapped值,如果该值不为NULL,说明iocp已经检测到一个连接已经中断。安全的关闭连接很多人写的 阅读全文
摘要:
对每个使用AcceptEx接受的连接套结字使用setsockopt设置SO_UPDATE_ACCEPT_CONTEXT选项,这个选项原义是把listen套结字一些属性(包括socket内部接受/发送缓存大小等等)拷贝到新建立的套结字,却可以使后续的shutdown调用成功。/* SO_UPDATE_ACCEPT_CONTEXT is required for shutdown() to work fine*/setsockopt( sockClient,SOL_SOCKET,SO_UPDATE_ACCEPT_CONTEXT,(char*)&m_sockListen,sizeof(m_s 阅读全文