2013年1月28日

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 阅读(230) 评论(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 阅读(1140) 评论(0) 推荐(0) 编辑

使用TCP keepalive还是HeartBeat心跳包?

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

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

WinSock TCP keepalive的机理及使用

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

posted @ 2013-01-28 16:12 zhuyf87 阅读(946) 评论(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 阅读(501) 评论(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 阅读(977) 评论(0) 推荐(0) 编辑

导航