随笔分类 -  网络

boost asio 应用方法学——深入框架
摘要:原文地址:http://blog.csdn.net/luansxx/article/details/7854326要用好它,就必须先了解它,而且不能停止于表面,必须深入到内部。而了解一件事物,先要了解它的框架,再了解它的细节。了解了框架,我们就有了提纲挈领的认识。关于 boost asio 框架结构,在其文档中,用了这样一张图来描述:简单解释一下:这里由使用者(Initiator)启动一个异步操作(Asynchronous Operation),在启动异步的同时它要负责创建一个异步回调对象(Completion Handler),然后该异步操作被交给了异步操作执行者(Asynchronous 阅读全文

posted @ 2013-03-02 13:26 zhuyf87 阅读(3580) 评论(0) 推荐(0)

Boost.Asio和ACE之间关于Socket编程的比较
摘要:原文地址:http://blog.163.com/miky_sun/blog/static/3369405201041753652505/ACE是一个很成熟的中间件产品,为自适应通讯环境,但它过于宏大,一堆的设计模式,架构是一层又一层,对初学者来说,有点困难。ASIO是基本Boost开发的异步IO库,封装了Socket,简化基于socket程序的开发。最近分析ASIO的源代码,让我无不惊呀于它的设计。在ACE中开发中的内存管理一直让人头痛,ASIO的出现,让我看到新的曙光,成为我新的好伙伴。简单地与ACE做个比较。boost::asio是一个高性能的网络开发库,Windows下使用IOCP,L 阅读全文

posted @ 2013-03-02 13:01 zhuyf87 阅读(1453) 评论(0) 推荐(0)

Winsock 套接字I/O模型 之 select 模型
摘要:“select模型”是利用select函数来管理I/O。select函数可用于判断套接字上是否存在数据,或者能否向一个套接字写入数据。比如可以先调用select函数判断能否从某个套接字读数据,以避免直接调用recv进入阻塞状态(或者在非阻塞模式时产生WSAEWOULDBLOCK错误)。int select( __in int nfds, __in_out fd_set* readfds, __in_out fd_set* writefds, __in_out fd_set* exceptfds, __in const struct timeval*... 阅读全文

posted @ 2013-01-29 14:11 zhuyf87 阅读(543) 评论(0) 推荐(0)

TCP长连接与短连接的区别
摘要:原文地址:http://www.cnblogs.com/beifei/archive/2011/06/26/2090611.html1. TCP连接当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的经典的三次握手示意图:经典的四次握手关闭图:2. TCP短连接我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接。client向se 阅读全文

posted @ 2013-01-28 17:50 zhuyf87 阅读(239) 评论(0) 推荐(1)

长连接API小心“窜包”问题
摘要:原文地址:http://pananq.com/index.php/2011/07/31/有时候,我们以API的方式为客户提供服务,如果此时你提供的API采用TCP长连接,而且还使用了TCP接收超时机制(API一般都会提供设置超时的接口,例如通过setsockopt设置SO_RCVTIMEO),那你可能需要小心下面这种情况(这里姑且称之为“窜包”,应用程序没有将应答包与请求包正确对应起来):如果某一笔以TCP接收超时(例如设置为3秒)返回客户,此时客户继续使用该链接发送第二个请求,此时后者就有可能收到前一笔请求的应答(前一笔的应答在3秒后才到达),倘若错误的将此应答当做后者的应答处理,那就可能会 阅读全文

posted @ 2013-01-28 17:41 zhuyf87 阅读(1169) 评论(0) 推荐(0)

使用TCP keepalive还是HeartBeat心跳包?
摘要:对于TCP长连接,需要“保活”机制。可以在上层协议中自己实现“心跳包”,也可以使用TCP底层自身的Keepalive机制。这两种方式采用哪种更好呢?这里贴一下一位网友的回帖,我觉得说的不错。“套接字本身是有一套心跳保活机制的(TCP Keepalive),不过默认的设置并不像我们一厢情愿的那样有效。在双方TCP套接字建立连接后(即都进入ESTABLISHED状态)并且在两个小时左右上层没有任何数据传输的情况下,这套机制才会被激活。很多人认为两个小时的时间设置得很不合理。为什么不设置成为10分钟,或者更短的时间?(可以通过SO_KEEPALIVE选项设置。)但是这样做其实并不被推荐。实际上这套机 阅读全文

posted @ 2013-01-28 17:21 zhuyf87 阅读(1886) 评论(0) 推荐(0)

WinSock TCP keepalive的机理及使用
摘要:原文地址:http://blog.csdn.net/silvervi/article/details/6031975TCP 是面向连接的 , 在实际应用中通常都需要检测对端是否还处于连接中。如果已断开连接,主要分为以下几种情况:1. 连接的对端正常关闭,即使用 closesocket 关闭连接。2. 连接的对端非正常关闭,包括对端异常关闭,网络断开等情况。对于第一种情况,很好判断,但是对于第二种情况,可能会要麻烦一些。在网上找到了一些文章,大致有以下两种解决方法:自己编写心跳包程序简单的说也就是在自己的程序中加入一条线程,定时向对端发送数据包,查看是否有 ACK ,如果有则连接正常,没有的话则 阅读全文

posted @ 2013-01-28 16:12 zhuyf87 阅读(1013) 评论(0) 推荐(0)

闲说HeartBeat心跳包和TCP协议的KeepAlive机制
摘要:原文地址:http://www.felix021.com/blog/read.php?2076很多应用层协议都有HeartBeat机制,通常是客户端每隔一小段时间向服务器发送一个数据包,通知服务器自己仍然在线,并传输一些可能必要的数据。使用心跳包的典型协议是IM,比如QQ/MSN/飞信等协议。学过TCP/IP的同学应该都知道,传输层的两个主要协议是UDP和TCP,其中UDP是无连接的、面向packet的,而TCP协议是有连接、面向流的协议。所以非常容易理解,使用UDP协议的客户端(例如早期的“OICQ”,听说OICQ.com这两天被抢注了来着,好古老的回忆)需要定时向服务器发送心跳包,告诉服务 阅读全文

posted @ 2013-01-28 13:17 zhuyf87 阅读(513) 评论(0) 推荐(0)

Winsock 套接字模式
摘要:阻塞模式在阻塞模式下,I/O操作完成之前,Winsock调用会一直等待,不会立即返回。Winsock应用程序通常是遵照“生产者-消费者”模型,应用程序需要读取(或写入)指定数量的字节,然后以该数据为基础执行计算。SOCKET sock;char buff [256];int done = 0;…while (!done){ nBytes = recv(sock, buff, 65); if (nBytes == SOCKET_ERROR) { printf(“recv failed with error %d \n”, WSAGetLastError()); ... 阅读全文

posted @ 2013-01-28 10:29 zhuyf87 阅读(1007) 评论(0) 推荐(0)

Winsock IO方法
摘要:Winsock分别提供了套接字模式和套接字I/O模型。套接字模式用于决定Winsock函数随套接字调用的行为,套接字模型描述了一个应用程序如何对套接字上的I/O进行管理及操作。套接字模式包含:阻塞模式和非阻塞模式。所有的Windows平台都支持这两种模式。I/O模型有助于应用程序通过某种异步方式,一次对一个或多个套接字上进行的通信加以管理。这些模型包括Non-blocking select(选择)、WSAAsyncSelect(异步选择)、WSAEventSelect(事件选择)、Overlapped I/O(重叠I/O)、Completion port(完成端口)。Windows CE系统仅 阅读全文

posted @ 2013-01-27 20:43 zhuyf87 阅读(371) 评论(0) 推荐(0)

[知识扫盲]什么是VPN?VPN有什么用?有免费的VPN吗?
摘要:原文地址:http://www.laoyao.cc/post/2817.html这几天看小冬同学一直在搞VPN,做了多家VPN的代理,开始卖起VPN了,作为VPN小白的我,一直对VPN只有一个虚拟的概念,如今也该好好学习学习,去弄明白到底什么是VPN,VPN是做什么用的,有什么功能?各种谷歌百度后,算是有了一定的了解,于是写此文章,与各位VPN小白共勉,高手请勿在此停留,更勿在此拍砖,请直接飘走~什么是VPN?VPN英文全称是“Virtual Private Network”,翻译过来就是“虚拟专用网络”。vpn被定义为通过一个公用网络(通常是因特网)建立一个临时的、安全的连接,是一条穿过混乱 阅读全文

posted @ 2013-01-22 00:03 zhuyf87 阅读(229) 评论(0) 推荐(0)

学之者生,用之者死——ACE历史与简评
摘要:原文地址:http://www.cnblogs.com/Solstice/archive/2010/03/10/ace_history.html学之者生,用之者死——ACE历史与简评陈硕 (giantchen_AT_gmail)Blog.csdn.net/Solstice2010 March 10ACE 是现代面向对象网络编程的鼻祖,确立了许多重要模式,如 Reactor、Acceptor 等,重要到我们甚至觉得网络编程就应该是那样的。但为什么 ACE 叫好不叫座?大名鼎鼎却使用者寥寥?本文谈谈我的个人观点。ACE 是一套重量级的 C++ 网络库,早期版本由 Douglas Schmidt 独 阅读全文

posted @ 2013-01-21 12:10 zhuyf87 阅读(426) 评论(0) 推荐(0)

TCP 套接字函数
摘要:TCP(Transmission Control Protocol)为应用程序提供可靠的数据传输服务,它是网络编程中使用最广泛的一种(传输层)协议。使用TCP通信的两个应用程序,一个作为服务器,另一个作为客户端。下图是设计TCP程序的基本流程。服务器端会有两个socket(并发服务器会有多个),其中一个是侦听socket(图中srv),等待客户来建立连接。另一个是接收到客户端连接请求而建立的新的socket,用于与客户端交互(图中clt)。服务器启动时首先创建侦听socket srv,绑定本地地址,并在srv上侦听,调用accept后阻塞,直到有客户建立连接。accept返回一个新的socke 阅读全文

posted @ 2013-01-13 20:21 zhuyf87 阅读(1926) 评论(0) 推荐(1)

TCP三次握手
摘要:建立TCP连接的过程需要进行三次信息交换,通常称为“三次握手”,示意图如下:图中Seq代表TCP段首部中的“序号(Sequence Number)”:是TCP段所发送的数据部分第一个字节的序号。在TCP传送的数据流中,每一个字节都有一个序号。建立连接时,发送方将初始序号(Initial Sequence Number, ISN)填写到第一个发送的TCP段序号中。图中Ack代表TCP段首部中的“确认号”:是期望收到对方下次发送的数据的第一个字节的序号,也就是期望收到的下一个TCP段的首部中的序号,等于已经成功收到的TCP段的最后一个字节序号加1。确认号在ACK标志为1时有意义,除了主动发起连接的 阅读全文

posted @ 2012-12-31 14:29 zhuyf87 阅读(3076) 评论(2) 推荐(0)

TCP状态描述
摘要:TCP的有限状态机用来管理一个连接,当第一次运行时,连接从一个初始状态CLOSED开始,当两个应用程序开始通信时,经过一系列的TCP段交换和状态变迁,直到成功建立连接,两端都处于ESTABLISHED状态,正常的数据发送和接收都发生在这一状态。TCP的大部分时间也处于这一状态,当发生错误或程序退出通信时,关闭连接,经历一系列相关的状态变迁,返回到最初的CLOSED状态。标准给出了在TCP连接的各个状态中,发生某些事件要执行的动作和状态转移行为。下表对TCP各个状态进行简单的描述。状态描述CLOSED连接的起始状态,这是一个“虚构”的状态,实际上此时还没有连接存在,也没有传输控制块(TCB)LI 阅读全文

posted @ 2012-12-31 12:17 zhuyf87 阅读(518) 评论(0) 推荐(0)

TCP协议数据格式
摘要:TCP协议间交换的数据单元称为“TCP段”,包括两部分:首部和数据。标准首部长20字节,带有选项的首部会更长。1. 源端口和目的端口各占2字节,端口号加上IP地址,共同构成socket。互相通信的进程使用一对socket,包括协议、源IP、源端口、目的IP、目的端口,这五个元素唯一确定一个TCP连接。2. 序号占4字节,是TCP段所发送的数据部分第一个字节的序号。在TCP传送的数据流中,每一个字节都有一个序号。建立连接时,发送方将初始序号(Initial Sequence Number, ISN)填写到第一个发送的TCP段序号中。3. 确认号占4字节,是期望收到对方下次发送的数据的第一个字节的 阅读全文

posted @ 2012-12-29 15:20 zhuyf87 阅读(16743) 评论(0) 推荐(3)

TCP(传输控制协议)简介
摘要:TCP是一个面向连接的、端到端的可靠的传输层协议。位于TCP/IP网络分层架构中的第三层,底层是IP协议。IP把TCP段封装在数据报中发送到网络上。TCP的正式标准是RFC793,后序又有许多其他RFC补充了TCP其他方面的附加信息,其中一些是为适应现代网络所做的增强。793传输控制协议813窗口和确认策略879最大段长度和相关专题1122互联网主机要求——通信层1323TCP高性能扩展2018TCP选择性确认2581TCP拥塞控制2757细长网络2988计算TCP重传定时器TCP协议在传输数据之前先在两台设备之间建立一条虚拟连接,之后就可以双向传输数据。它使用端口为应用程序提供传输层寻址,这 阅读全文

posted @ 2012-12-27 15:46 zhuyf87 阅读(1012) 评论(0) 推荐(0)

socket connect 函数设置超时
摘要:使用Winsock connect函数,无法设置超时,而在连接一个不存在的主机时,将会阻塞至少要几十秒。其实在调用connect函数时,将socket设置为非阻塞,然后调用select函数,可以达到设置超时的效果。bool ConnectWithTimeout(SOCKET socket, char * host, int port, int timeout){ TIMEVAL timeval = {0}; timeval.tv_sec = timeout; timeval.tv_usec = 0; struct sockaddr_in address; ad... 阅读全文

posted @ 2012-12-26 12:39 zhuyf87 阅读(10234) 评论(0) 推荐(0)

Winsock IO模式
摘要:Winsock主要有三种IO操作模式:阻塞、非阻塞、重叠IO。默认情况下Winsock都是建立阻塞的socket,为了创建非阻塞socket,需要使用ioctlsocket的FIONBIO命令把socket设置为非阻塞。如果要使用重叠IO功能,需要在创建socket时指定重叠IO属性。1. 阻塞IO任何IO操作只有在完成后才能返回,阻塞函数在完成其指定的任务之前不允许程序执行另外的语句。阻塞IO编程简单,但不是最有效的编程方式。2. 非阻塞IO当执行一个IO操作时,如果此IO操作不会引起阻塞,函数将立即执行,并返回给调用者。如果此IO操作会引起阻塞,则函数返回错误码WSAEWOULDBLOCK 阅读全文

posted @ 2012-12-25 15:22 zhuyf87 阅读(650) 评论(0) 推荐(1)

TCP连接connect等待时长控制的另一种方法
摘要:原文地址:http://blog.csdn.net/slin000/article/details/3971644在TCP网络应用开发中,作为客户端的程序经常需要主动连接服务器,这时你就需要建立一个Socket,然后调用connect函数连接到服务器地址。正常情况下,这并没有什么问题,但当服务器主机不存在的时候,connect函数可能会等待一分多钟才能返回。如果在主线程中调用connect函数,就会产生长时间无法响应的状况。在现代的互联网硬件环境中,一分钟的等待有点太长了,我们需要缩短等待时间。在Linux环境下,可以用alarm调用定时唤醒正在等待的线程,使connect函数从等待中返回,但 阅读全文

posted @ 2012-12-24 13:17 zhuyf87 阅读(5561) 评论(0) 推荐(1)

导航