网络通讯服务器设计
文章平均质量分 72
chshji666666
这个作者很懒,什么都没留下…
展开
-
SOCKET类的设计和实现
WinSock基本知识 这里不打算系统地介绍socket或者WinSock的知识。首先介绍WinSock API函数,讲解阻塞/非阻塞的概念;然后介绍socket的使用。 WinSock API Socket接口是网络编程(通常是TCP/IP协议,也可以是其他协议)的API。最早的Socket接口是Berkeley接口,在Unxi操作系统中实现。WinSock原创 2010-01-24 15:16:00 · 191 阅读 · 0 评论 -
封包和拆包
对于基于TCP开发的通讯程序,有个很重要的问题需要解决,就是封包和拆包.自从我从事网络通讯编程工作以来(大概有三年的时间了),我一直在思索和改进封包和拆包的方法.下面就针对这个问题谈谈我的想法,抛砖引玉.若有不对,不妥之处,恳求大家指正.在此先谢过大家了.一.为什么基于TCP的通讯程序需要进行封包和拆包.TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想想河里的流水,是连成一片的,其间是没有分界线的.但一般通讯程序开发是需要定义一个个相互独立的数据包的,比如用于登陆的数据包,用于注销的数据包.原创 2010-10-19 13:38:00 · 457 阅读 · 0 评论 -
PostQueuedCompletionStatus函数与GetQueuedCompletionStatus函数
<br />PostQueuedCompletionStatus函数,向每个工作者线程都发送—个特殊的完成数据包。该函数会指示每个线程都“立即结束并退出”.下面是PostQueuedCompletionStatus函数的定义:<br />BOOL PostQueuedCompletionStatus(<br /> HANDLE CompletlonPort,<br /> DW0RD dwNumberOfBytesTrlansferred,<br /> DWORD dwCompletlonK原创 2011-05-10 17:00:00 · 2180 阅读 · 1 评论 -
拼包函数及网络封包的异常处理
常见的网络服务器,基本上是7*24小时运转的,对于网游来说,至少要求服务器要能连续工作一周以上的时间并保证不出现服务器崩溃这样的灾难性事件。事实上,要求一个服务器在连续的满负荷运转下不出任何异常,要求它设计的近乎完美,这几乎是不太现实的。服务器本身可以出异常(但要尽可能少得出),但是,服务器本身应该被设计得足以健壮,“小病小灾”打不垮它,这就要求服务器在异常处理方面要下很多功夫。 服务器的异常处理包括的内容非常广泛,本文仅就在网络封包方面出现的异常作一讨论,希望能对正从事相关工作的朋友有所帮助。原创 2011-04-08 11:21:00 · 323 阅读 · 0 评论 -
泡泡堂、QQ堂游戏通信架构分析
之前,我分析过QQ游戏(特指QQ休闲平台,并非QQ堂,下同)的通信架构(http://blog.csdn.net/sodme/archive/2005/06/12/393165.aspx),分析过魔兽世界的通信架构(http://blog.csdn.net/sodme/archive/2005/06/18/397371.aspx),似乎网络游戏的通信架构也就是这些了,其实不然,在网络游戏大家庭中,还有一种类型的游戏我认为有必要把它的通信架构专门作个介绍,这便是如泡泡堂、QQ堂类的休闲类竞技游戏。曾经很多次,原创 2011-04-08 11:14:00 · 682 阅读 · 0 评论 -
QQ 游戏到底是如何实现百万人同时在线并保持游戏高效率的呢?
在技术上,QQ 游戏到底是如何实现百万人同时在线并保持游戏高效率的呢? 事实上,针对于任何单一的网络服务器程序,其可承受的同时连接数目是有理论峰值的,通过C++中对TSocket的定义类型:word,我们可以判定这个连接理论峰值是65535,也就是说,你的单个服务器程序,最多可以承受6万多的用户同时连接。但是,在实际应用中,能达到一万人的同时连接并能保证正常的数据交换已经是很不容易了,通常这个值都在2000到5000之间,据说QQ的单台服务器同时连接数目也就是在这个值这间。 如果要实现2000到5000原创 2011-04-15 22:35:00 · 283 阅读 · 0 评论 -
Winsock 初探
在编写Windows网络应用程序的时候,最常用的便是Winsock接口,注意它不是网络协议,你可以理解它为网络应用API。在百度百科中是这样介绍的:” Windows下网络编程的规范-Windows Sockets是Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口。从1991年的1.0版到1995年的2.0.8版,经过不断完善并在Intel、Microsoft、Sun、SGI、Informix、Novell等公司的全力支持下,已成为Windows网络编程的事实上的标准。 “实际上Windo原创 2011-04-14 21:06:00 · 257 阅读 · 0 评论 -
accept不阻塞的原因
在用这段代码的时候发现accept总是在没有连接就直接返回了:int clientAddrLen = 0;cSocket = accept(lSocket,(SOCKADDR*)&clientAddr,&clientAddrLen);弄了N久后才发现是这个问题,之前看MSDN还以为第三个参数只是对外传的呢,汗这段代码就OK了int clientAddrLen = sizeof(SOCKADDR);cSocket = accept(lSocket,(SOCKADDR*)&clientAddr,&clientA原创 2011-04-14 22:43:00 · 436 阅读 · 0 评论 -
内存管理(AWE)——完成端口通讯服务器(IOCP Socket Server)设计(二)
有牛人曾经说过,服务器玩的就是内存。仔细想想,确实是如此。服务器对内存的需求是巨大的,对内存的要求也是苛刻的。如何在内存管理上下功夫使服务器性能达到一个质的飞跃,是服务器设计中的首要解决的问题。说到内存,我想刚开始设计服务器的人会说,不就申请释放吗,有什么难呢。从操作步骤来说,确实就这么两个,没有再多了的工作了。当我们采用虚拟内存分配或堆分配从操作系统获取内存的时候,总以为我们获得了足够的内存就可以让服务器安心工作了。但事情并未就这么简单,操作系统在一定条件下,还可以征用已经分配给你的物理内存,它会将你的物原创 2011-04-16 13:31:00 · 396 阅读 · 0 评论 -
TCP协议疑难杂症全景解析
说明:1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人。因为本文不会解析TCP头里面的每一个字段或者3次握手的细节,也不会解释慢启动和快速原创 2011-07-22 14:12:35 · 271 阅读 · 0 评论 -
WSAEnumProtocols的用法
#include #include #pragma comment(lib, "ws2_32.lib")void main(void){ WSADATA wsaData; WSAStartup( MAKEWORD( 2, 2 ), &w原创 2011-09-07 21:58:15 · 855 阅读 · 0 评论 -
Winsock 的I/O模式- -
文章简单介绍了套接字5种I/O模型的前三种比较简单的模型......2004.12.221、 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序。套接字 默认为阻塞模式。可以通过多线程技术进行处理。 非阻塞模式:执行I/O操作时,Winsock函数会返回并交出控制权。这种模式使用 起来比较复杂,因为函数在没有运行完成就进行返回,会不断地返回 WSAEWOULDBLOCK错误。但功能强大。为了解决这个问题,提出了进行I/O操作的一些I/O模型原创 2010-10-12 10:45:00 · 244 阅读 · 0 评论 -
WindowsI/O模型
如果你想在Windows平台上构建服务器应用,那么I/O模型是你必须考虑的。Windows操作系统提供了选择(Select)、异步选择(WSAAsyncSelect)、事件选择(WSAEventSelect)、重叠I/O(Overlapped I/O)和完成端口(Completion Port)共五种I/O模型。每一种模型均适用于一种特定的应用场景。程序员应该对自己的应用需求非常明确,而且综合考虑到程序的扩展性和可移植性等因素,作出自己的选择。我会以一个回应反射式服务器(与《Windows网络编程》原创 2010-10-12 14:31:00 · 273 阅读 · 0 评论 -
网络游戏程序员须知 收包与发包
简介 大家好,今天我们就来说说网络游戏程序员须知的第二篇:收包与发包。 上一篇中我们比较了UDP和TCP两种协议,最后的结论是我们必须使用更方便订制的UDP协议来做游戏的网络传输协议以便于我们的游戏能有更好的实时性,不至于因为丢包等问题造成不必要的麻烦。 现在就让我写点实际的代码来具体说明吧。 BSD socket 现代的平台系统中,大多数会有基于BSD端口的端口协议支持。 BSD协议端口一般是会有一些类似于“socket”, “bind”, “sendto”,“recvfrom”的API, 当然你可以原创 2010-10-03 09:53:00 · 316 阅读 · 0 评论 -
WinSock基本知识
WinSock基本知识 这里不打算系统地介绍socket或者WinSock的知识。首先介绍WinSock API函数,讲解阻塞/非阻塞的概念;然后介绍socket的使用。 WinSock API Socket接口是网络编程(通常是TCP/IP协议,也可以是其他协议)的API。最早的Socket接口是Berkeley接口,在Unxi操作系统中实现。WinSock原创 2010-01-25 13:12:00 · 218 阅读 · 0 评论 -
WIN网络编程-TCPServer
#include "../common/InitSock.h"#include CInitSock initSock; //初始化Winsock库int main(){ // 创建套节字 SOCKET sListen = ::socket(AF_INET, SOCK_STREAM,IPPROTO_TCP); if(sListen == INVALID_SOCKET) { printf("F原创 2009-12-21 21:48:00 · 226 阅读 · 0 评论 -
WIN网络编程-重叠I/0服务器设计
///////////////////////////////////////////////////////// OverlappedServer.cpp文件//基于重叠I/0模型的简单的回显TCP服务器,它接受客户端连接之后,将从客//户端接收到的数据再发送给客户端。本例采用了单线程。//使用重叠I/O模型必须使用WSASocket函数创建套接字,传送数据使用//WSASend原创 2009-12-21 21:51:00 · 273 阅读 · 0 评论 -
IOCP
IOCP(I/O Completion Port,I/O完成端口)是性能最好的一种I/O模型。它是应用程序使用线程池处理异步I/O请求的一种机制。在处理多个并发的异步I/O请求时,以往的模型都是在接收请求是创建一个线程来应答请求。这样就有很多的线程并行地运行在系统中。而这些线程都是可运行的,Windows内核花费大量的时间在进行线程的上下文切换,并没有多少时间花在线程运行上。再加上创建新线程的开销比较大,所以造成了效率的低下。 调用的步骤如下:抽象出一个完成端口大概的处理流程: 1:创建一个完成端口。 2:原创 2010-07-15 22:32:00 · 172 阅读 · 0 评论 -
IOCP
IOCP(I/O Completion Port,I/O完成端口)是性能最好的一种I/O模型。它是应用程序使用线程池处理异步I/O请求的一种机制。在处理多个并发的异步I/O请求时,以往的模型都是在接收请求是创建一个线程来应答请求。这样就有很多的线程并行地运行在系统中。而这些线程都是可运行的,Windows内核花费大量的时间在进行线程的上下文切换,并没有多少时间花在线程运行上。再加上创建新线程的开销比较大,所以造成了效率的低下。 调用的步骤如下:抽象出一个完成端口大概的处理流程: 1:创建一个完成端口。 2:原创 2010-07-15 22:33:00 · 229 阅读 · 0 评论 -
IOCP模型总结
IOCP(I/O Completion Port,I/O完成端口)是性能最好的一种I/O模型。它是应用程序使用线程池处理异步I/O请求的一种机制。在处理多个并发的异步I/O请求时,以往的模型都是在接收请求是创建一个线程来应答请求。这样就有很多的线程并行地运行在系统中。而这些线程都是可运行的,Windows内核花费大量的时间在进行线程的上下文切换,并没有多少时间花在线程运行上。再加上创建新线程的开销比较大,所以造成了效率的低下。 调用的步骤如下:抽象出一个完成端口大概的处理流程: 1:创建一个完成端口。 2:原创 2010-07-15 09:16:00 · 197 阅读 · 0 评论 -
SocketAPI,CAsyncSocket,CSocket比较说明及其用法
要进行网络编程就要和Socket打交道,Socket有同步阻塞方式和异步非阻塞方式两种使用,事实上同步和异步在我们编程的生涯中可能遇到了很多,而Socket也没什么特别。虽然同步好用,不费劲,但不能满足一些应用场合,其效率也很低。 或许初涉编程的人不能理解“同步(或阻塞)”和“异步(或非阻塞)”,其实简单两句话就能讲清楚,同步和异步往往都是针对一个函数来说的,“同步”就是函数直到其要执行的功能全部完成时才返回,而“异步”则是,函数仅仅做一些简单的工作,然后马上返回,而它所要实现的功能留给别的线程或者函原创 2010-07-20 21:25:00 · 251 阅读 · 0 评论 -
使用MFC快速实现网络编程 CAsyncSocket
随着计算机网络化的深入,计算机网络编程在程序设计的过程中变得日益重要。由于C++语言对底层操作的优越性,许多文章都曾经介绍过用VC++进行Socket编程的方法。但由于都是直接利用动态连接库wsock32.dll进行操作,实现比较繁琐。其实,VC++的MFC类库中提供了CAsyncSocket这样一个套接字类,用他来实现Socket编程,是非常方便的。 ---- 本文将用一个Echo例程来介绍CAsyncSocket类的用法。 ---- 一. 客户端---- 1. 创建一个Dialog Based项目:CS原创 2010-06-08 21:13:00 · 176 阅读 · 0 评论 -
游戏服务器的架构设计
游戏服务器的设计是一项颇有挑战性的工作,游戏服务器的发展也由以前的单服结构转变为多服机构,甚至出现了bigworld引擎的分布式解决方案,最近了解到Unreal的服务器解决方案atlas也是基于集群的方式。负载均衡是一个很复杂的课题,这里暂不谈bigworld和atlas的这类服务器的设计,更多的是基于功能和场景划分服务器结构。首先说一下思路,服务器划分基于以下原则:1:分离游戏中占用系统资源(cpu,内存,IO等)较多的功能,独立成服务器2:在同一服务器架构下的不同游戏,应尽可能的复用某些服务器(进程级别原创 2010-06-16 20:04:00 · 250 阅读 · 0 评论 -
发布一套IOCP框架
该框架基于Windows Overlapped IO的完成端口模式。彻底分离了IO线程和Work线程。并且易扩展、易复用、易维护。目前,所提供的源码提供了Socket和File的异步操作,可以非常方便的扩展为支持其他的操作。编译环境需求:VS2008+SP1以上(支持C++ tr1组件即可)。大致的层次图如下:类图如下:这里,给出的源码和简单的示例(请以所提供的demo程序为准)#ifndef __SERVICE_HPP#define __SERVICE_HPP#include #include "../.原创 2010-08-21 17:14:00 · 328 阅读 · 0 评论 -
飞鸽传书系列 一 “无法解析外部符号 __security_cookie”问题解决
编译VC工程时出现了标题所示问题,资料搜索一下,在微软网站找到答案了,解决方法如下:1)选择“项目”-》“属性”-》“C/C++”-》“代码生成”-》“缓冲区安全检查”,设为“否”2)选择“项目”-》“属性”-》“链接器”-》“输入”-》“附加依赖项”,增加”buffer原创 2011-08-10 20:36:07 · 401 阅读 · 0 评论