C++网络开发
文章平均质量分 54
markman101
这个作者很懒,什么都没留下…
展开
-
分布式系统介绍(持续更新)
分布式系统介绍目 录1 修改记录...12 概要...23 分布式计算...3 1 概要本文主要对大规模分布式系统的发展进行梳理,以加深理解。 2 分布式计算 随着计算机技术的发展和信息爆炸时代的来临,人们对数据计算的需求越来越高,特别是海量数据的科学计算。传统的单机受到计算速度、容量原创 2013-02-17 14:19:29 · 1126 阅读 · 0 评论 -
单机最多开启不超过4千个客户端连接的问题
客户端在Connect之前没有进行bind()操作或者bind的端口是0。系统会随机分配端口范围(1024~5000).也就是在上述情况下最多开启3976个客户端连接。原因:win2k缺省的出站连接的临时端口为1024-5000,要想使用更多的出站端口需要修改注册表修改方式:在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servi原创 2012-05-31 17:40:20 · 943 阅读 · 0 评论 -
IOCP原理
要想彻底征服IOCP,并应用好IOCP这个模型,首先就让我们穿越到遥远的计算机青铜器时 代(以出现PC为标志),那时候普通的PC安装的还是DOS平台,微软公司主要靠这个操作系统在IT界的原始丛林中打拼,在DOS中编写程序,不得不与很 多的硬件直接打交道,而最常操作的硬件无非是键盘、声显卡、硬盘等等,这些设备都有一个特点就是速度慢,当然是相对于PC平台核心CPU的速度而言,尤其 是硬盘这个机械电子设转载 2012-05-10 20:53:04 · 2185 阅读 · 2 评论 -
1IOCP背景知识--重叠I/O理解
为了不必等待I/O完成后,程序逻辑才能自由往下执行,在系统上出现了“重叠I/O”来实现异步I/O。重叠I/O有两层含义:异步、重叠。异步实现方式:程序调用完I/O函数后立即返回,程序逻辑继续往下执行,同时程序创建一个线程“监听”I/O操作完成的通知。这样程序和I/O操作就实现了“异步”执行。重叠的含义不必等到上一个I/O操作的完成通知就可以调用下一个I/O操作,这些I/O操作堆叠在一起等待完成。而原创 2012-05-10 20:51:22 · 1375 阅读 · 0 评论 -
IOCP编程之重叠IO
其实这个标题有点“标题党”的味道,为了大家搜索方便我故意冠以IOCP编程之名,其实重叠IO编程并不一定需要IOCP,而IOCP编程就一定需要重叠IO。是不是已经被这句话给绕晕了?总之是为了更好的应用IOCP,所以要理解重叠IO。这篇文章的核心就是讨论重叠IO的来龙去脉。在很久很久以前,在用C语言写DOS程序的年代,就有了很完整的IO标准库支撑,printf输出字符到屏幕,fopen,fwrit转载 2012-05-10 20:25:37 · 3032 阅读 · 1 评论 -
怎样使用WSAGetLastError?------举例:以网络编程中的recv讲解
问一个问题:A机与B机已通过TCP协议连接上A机用send发送消息给B机后,就等待B回复,此时A机处于recv状态而此时B正好收到消息,正发送消息的那刻,突然停电了.此时A机应该处于什么状态?是继续等待,还是立即关闭?注:A机此时处理的消息为recv命令那地方.----------------------------------------------------举转载 2012-05-07 20:10:16 · 4205 阅读 · 0 评论 -
长连接与短连接
长连接与短连接所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。 短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,一般银行都使用短连接。 比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。转载 2012-05-07 19:55:41 · 867 阅读 · 0 评论 -
IO - 同步,异步,阻塞,非阻塞
原文地址:http://blog.csdn.net/historyasamirror/article/details/5778378读完此兄文章 也谈谈自己的感悟。文章中主要比较了四种IO Model: blocking IO nonblocking IO IO multiplexing asynchronous IO 背景知识:对于一原创 2012-02-29 16:15:33 · 1041 阅读 · 1 评论 -
int listen(int sockfd, int backlog) 第二个参数 解疑
int listen(int sockfd, int backlog)backlog 是未经过处理的连接请求队列可以容纳的最大数目。 即每一个连入请求都要进入一个连入请求队列,等待 listen 的程序调用accept()函数来接受这个连接。当系统还没有 调用accept()函数的时候,如果有很多连接,那么本地能够等待的最大数目就是backlog转载 2011-12-21 17:25:03 · 4359 阅读 · 0 评论 -
服务器端出现TIME_WAIT
TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。在众多TCP状态中,最值得注意的状态有两个:CLOSE_WAIT和TIME_WAIT。 1、LISTENING状态 FTP转载 2011-03-10 13:28:00 · 1784 阅读 · 0 评论 -
SYN攻击实现
SYN攻击xxx.xx.xxx.xxx机器上用netstat –n –p tcp命令查看,可以发现很多SYN_RECEIVED连接。而且都是发生在80端口上,而且无法正常访问80端口上的服务。其他的网络连接、服务都是正常的。正常情况下不应该出现大量SYN_RECEIVED状态的TCP连接。例外这些连接的来源地址都是有一定的规律。根据经验可以确定是有恶意者对xxx.xx.xxx.转载 2012-05-17 10:57:12 · 4956 阅读 · 0 评论 -
采用IOCP模型开发SOCKET服务端设计思路
1、设计模式; IO收发线程与EMPLOY任务线程必须分离设计,否则如果只考虑IO线程来处理所有事情的话,一旦出现某个业务接口运行较慢,势必造成对IO网络的堵塞,那么这样的后台服务又有什么用呢? EMPLOY任务线程指派算法,要看具体业务来定,如果所有业务实现数据传输量大小差不多,反应时间长短都差不多的话,可以采取平均顺序分配的方式,否则可以按照业务具体调用来指派某一个转载 2012-06-17 09:45:11 · 1614 阅读 · 0 评论 -
C++ 与 字符编码格式
ASCII码是表示字符的基本编码,由于它是8位字节编码,只能表示256个字符。事实上在早期,ASCII是7位,英文的主要字符都小于128,后来扩展到8位,用大于128的编码表示特殊图形标记。当计算机进入中国后,面临汉字表示的问题,汉字的数目远大于256,于是中国制订GB2312编码。GB2312是一个兼容7位ASCII的变长字节编码格式。所谓变长是指英文字符仍然使用单字节表示,而中文使用双字转载 2012-12-10 11:55:45 · 5467 阅读 · 0 评论 -
localtime 和 localtime_r .
#include #include #include #include using namespace std;int main(int argc, char *argv[]){ time_t tNow =time(NULL); time_t tEnd = tNow + 1800; //注意下面两行的区别 struct tm*转载 2012-08-13 18:05:34 · 8005 阅读 · 0 评论 -
TCP/IP 学习笔记
1 拥塞避免算法 名称解释: 报文段--- TCP一次传输所发送的一定长度的字节段。 TCP的滑动窗口机制,作为接收方管理发送方发送数据量的手段,以防止接收方的接收缓冲区因为满而溢出。拥塞窗口(cwnd),接收端通知窗口(rwnd),慢启动阀值(ssthresh),慢启动的特征:1 cwnd被初始化为一个数据包大小原创 2012-08-07 22:08:59 · 2394 阅读 · 0 评论 -
Ping 127.0.0.1 与Ping 本机地址
背景知识:数据能传到以太网上就说明数据到了网卡,如果数据没有出以太网驱动程序那它肯定没有到网卡。 ip输出函数先检查地址是不是环回地址: 1. 如果是环回地址,直接交给环回驱动程序处理,返回ip输入函数 2. 如果不是环回地址,检查是不是广播地址或者多播地址,如果是数据报复制一份传给环回接口,然后送到以太网上。 3. 如果不是广播或者多播地址,才检查原创 2012-06-17 20:11:32 · 2085 阅读 · 0 评论 -
传输层 和网络层的区别
在协议栈中,传输层位于网络层之上,传输层协议为不同主机上运行的进程提供逻辑通信,而网络层协议为不同主机提供逻辑通信。这个区别很微妙,但是却非常重要。让我们用一家人作为类比来说明一下这个区别。 设想一下有两所房子,一个位于东海岸而另一个位于西海岸,每所房子里都住着12个小孩。东海岸的房子里的小孩和西海岸房子里的小孩是堂兄妹。两所房子里的孩子喜欢互相通信——每个孩子每周都给每一个堂兄妹写一封转载 2012-06-17 15:50:01 · 7906 阅读 · 1 评论 -
什么是带外数据?
带外数据(out—of—band data),有时也称为加速数据(expedited data), 是指连接双方中的一方发生重要事情,想要迅速地通知对方。 这种通知在已经排队等待发送的任何“普通”(有时称为“带内”)数据之前发送。 带外数据设计为比普通数据有更高的优先级。转载 2012-06-17 09:40:56 · 990 阅读 · 0 评论 -
SO_LINGER
setsockopt 设置 SO_LINGER 选项 此选项指定函数close对面向连接的协议如何操作(如TCP)。内核缺省close操作是立即返回,如果有数据残留在套接口缓冲区中则系统将试着将这些数据发送给对方。SO_LINGER选项用来改变此缺省设置。使用如下结构:struct linger { int l_onoff; /* 0 = off, nozer转载 2012-06-17 09:38:03 · 1059 阅读 · 0 评论 -
SOCK_RAW 与 SOCK_STREAM 、SOCK_DGRAM 区别
TCP/IP 四层模型:其中 SOCK_STREAM、SOCK_DGRAM 工作在传输层,SOCK_RAW 工作在网络层。SOCK_RAW 可以 处理ICMP、IGMP等网络报文、特殊的IPv4报文、可以通过IP_HDRINCL套接字选项由用户构造IP头。原创 2012-06-17 10:11:37 · 10495 阅读 · 0 评论 -
sockaddr , in_addr区别
struct sockaddr { unsigned short sa_family; char sa_data[14]; }; 上面是通用的socket地址,具体到Internet socket,用下面的结构,二者可以进行类型转换 s原创 2011-12-02 10:02:44 · 1123 阅读 · 0 评论 -
udp 编码的connect 函数 ——unix 网络编程 第8章
UDP 有两种 一种是面向无连接的(即不使用connect函数) 一种是类似TCP的面向连接的(即使用connect函数)区别:1>使用的I/O函数是:前者:sendto recvfrom后者: (send , write) (read,recv)。2> 前者 未连接的套接字可与多者后者 已连接的套接字 只可与一个IP地址交换数据。3> 后者传输消耗原创 2011-11-15 12:19:00 · 698 阅读 · 0 评论 -
TCP --recv函数相关
在TCP连接中,recv等函数默认为阻塞模式(block),即直到有数据到来之前函数不会返回,而我们有时则需要一种超时机制使其在一定时间后返回而不管是否有数据到来,这里我们就会用到setsockopt()函数: int setsockopt(int s, int level, int optname, void* optval, socklen_t* optlen); 这里我们要涉及到一个结构: struct timeval { time原创 2011-02-27 12:32:00 · 2287 阅读 · 0 评论 -
组播应用与编程
<br /><br />组播技术被认为是WWW技术推广之后出现的最激动人心的网络技术之一。1992年出现支<br />持IP组播的Mbone(组播主干网)和Mbone桌面工具;1993-1996年IP Multicast成为业界关注<br />的焦点,然而因发展条件不成熟使得IP组播只为业界所关注;进入1999年以来,IP组播具备<br />了发展的三个关键条件:支持组播的路由协议;基于开放标准的可测试管理协议;因商业发<br />展机遇而进入高速发展阶段。又一次掀起了组播实践的高潮,下面将有关组播应用作简原创 2010-09-29 11:24:00 · 3228 阅读 · 0 评论 -
windows.h和winsock2.h解决办法
1 首先明确一个概念 # ifndef #define #endif举例说明animal.h#ifndef ANIMAL_H_H //我们一般用#define定义一个宏,是为了在程序中使用,使程 序更加简洁,维护更加方便,然而在此处,我们只是为了判断#define ANIMAL_H_H ANIMAL_H_H是否定义,以此来避免类重复定义,因此我们没有为原创 2010-07-15 23:37:00 · 5884 阅读 · 0 评论 -
1 同步 异步 阻塞 非阻塞
<br /><br />1 同步异步阻塞非阻塞<br />二者的区别和联系是:<br />同步和异步是针对是消息的通知机制而言。<br />同步:你亲自等待消息的到来。<br />异步:建立一种消息通知机制由第三方时刻等待消息到来一旦到来第三方立即通知你你<br /> 而你可以在消息没有来之前做其他事。<br />同步: '你'亲自办这件事<br />异步:交代要做的事情,然后忙其他的事情;'别人'(内核)会充当你的跑腿,在条件就绪后将这事办成,然后通知你(callback);<br />以去银原创 2011-03-03 11:56:00 · 683 阅读 · 0 评论 -
设置套接字 为 非阻塞
<br /><br />当socket进行TCP连接的时候(也就是调用connect时),一旦网络不通,或者是ip 地址无效,就可能使整个线程阻塞。一般为30秒(我测的是20秒)。如果设置为非阻塞模式,能很好的解决这个问题,我们可以这样来设置非阻塞模式:调用ioctlsocket函数: <br />unsigned long flag=1; <br />if(ioctlsocket(sock,FIONBIO,&flag)!=0) <br />{ <br />closeso原创 2011-03-03 11:57:00 · 2452 阅读 · 0 评论 -
网络通讯——select()机制
背景知识分析: 1. fd_set 结构体 fd_set是文件句柄的集合。 FD_ZERO 清空这个集合; FD_SET 往这个集合里面加入一个文件句柄; FD_ISSET 查看某一个文件句柄是否被设置了; 'fd_set') 是一组文件描述符(fd)的集合。由于fd_set类型的长度在不同平台上不同,因此应该用一组标准的宏定义来处理此类变量: fd_set set; FD_ZERO(&set); /*原创 2011-02-18 17:46:00 · 6797 阅读 · 0 评论 -
几种winsock I/O模型的分析(全面分析)
<br />概要 <br /> 套接字是通信的基础,是支持网络协议数据通信的基本接口。Winsocket 提供了一些有趣的I/O模型,有助于应用程序通过一种“异步”方式,一次对一个或者多个套接字上进行的通信加以管理。这些模型包括select(选择)、WSAAsynSelect(异步选择)、WSAEventSelect(事件选择)、Overlapped I/O(重叠 I/O)以及Completion port(完成端口)。<br />① select 模型:<br转载 2011-05-19 21:57:00 · 1349 阅读 · 0 评论 -
与socket有关的一些函数介绍
<br />1、读取当前错误值:每次发生错误时,如果要对具体问题进行处理,那么就应该调用这个函数取得错误代码。 int WSAGetLastError(void ); #define h_errno WSAGetLastError()错误值请自己阅读Winsock2.h。2、将主机的unsigned long值转换为网络字节顺序(32位):为什么要这样做呢?因为不同的计算机使用不同的字节顺序存储数据。因此任何从Winsock函数对IP地址和端口号的引用和传给Wins转载 2011-05-19 21:54:00 · 579 阅读 · 0 评论 -
在 研究完成端口时 遇到 GetSystemInfo 做下记录
有一次,我正在开发一个视频压缩程序,而压缩算法是需要非常高效的,也就是需要使用到CPU的多媒体指令。在X86的领域里,目前主要有两家CPU,就是INTEL和AMD。它们的多媒体指令是不一样的。为了区分这种不同的指令,就需要调用函数GetSystemInfo来获取CPU的信息,然后再调用不同的动态连接库来进行多媒体数据压缩。 函数GetSystemInfo声明如下: WINBASEAPIVOIDWINAPIGetSystemInfo( __out LPSYSTEM_INFO lpSystemInfo转载 2011-03-18 20:32:00 · 704 阅读 · 0 评论 -
spserver 架构分析(一)
<br />一直对多线程和网络编程比较感兴趣,自学了一些winsock和TCP/IP的知识,一年前因为项目需要,接触了一段时间的ACE,使用了其中的Reactor框架,那时对网络编程还不甚熟悉,感觉ACE挺神秘。其间也就是根据项目需要使用了一下其中的某个框架,对于ACE内部的实现原理,也没怎么多想。<br /> 随着在网络以及多线程方面知识的积累,近日忽然想要学习一下ACE库的源代码,借鉴一下它的实现手法。到ACE的官网上下载了ACE的源代码,准备开始看时,却如堕五里雾中了,不转载 2011-03-09 23:31:00 · 1678 阅读 · 0 评论 -
SPServer
<br />在互联网企业里,*nux下的C/C++编程主要的焦点还是server开发,关于不同的server模型,在UNP第30章里有过简单的讨论,这里得出的结论就是多线程和多进程的server模型效率较高。但书中缺乏对多路复用机制的讨论,而当前主流的server模型则是epoll+multi-threads/multi-processes,lighttpd就属于这种模型。本文将探讨一个更加高效的server模型,half-synchorize/half-asynchorize模式。half-sync/ha转载 2011-03-09 23:26:00 · 2442 阅读 · 1 评论 -
线程池
来看一下线程池究竟是怎么一回事?其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态。可能你也许会问:为什么要搞得这么麻烦,如果每当客户端有新的请求时,我就创建一个新的线程不就完了?这也许是个不错的方法,因为它能使得你编写代码相对容易一些,但你却忽略了一个重要的问题??性能!就拿我所在的单位来说,我的单位是转载 2011-03-10 15:39:00 · 848 阅读 · 0 评论 -
bind() 10048错误的解决方法
原因:其他程序占用要绑定的端口解决:用netstat命令查看是哪个进程占用了该端口 比如要绑定端口号 2425 格式:netstat -ano | find "2425" 结果: UDP 0.0.0.0:2425 *:* 1716 最后的1716就是占用2425进程的进程ID,看看是什么,可以结束的直接结束该进程,再打开飞鸽就可以了。关于netstat命令可以输入命令 netstat /? 查看更多在任务管理器进程列表里显示转载 2011-03-10 13:48:00 · 9699 阅读 · 2 评论 -
IOCP
<br />本文主要探讨一下windows平台上的完成端口开发及其与之相关的几个重要的技术概念,这些概念都是与基于IOCP的开发密切相关的,对开发人员来讲,又不得不给予足够重视的几个概念:<br />1) 基于IOCP实现的服务吞吐量<br />2)IOCP模式下的线程切换<br />3)基于IOCP实现的消息的乱序问题。<br />一、IOCP简介<br /> 提到IOCP,大家都非常熟悉,其基本的编程模式,我就不在这里展开了。在这里我主要是把IOCP中所提及的概念做一个基本性的总结。转载 2011-03-09 23:33:00 · 2721 阅读 · 0 评论 -
SO_REUSEADDR作用
SO_REUSEADDR不是在同一台计算机上多个socket可以绑定同一个端口。一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。原创 2010-03-31 16:36:00 · 1190 阅读 · 0 评论