TCP连接在没有数据交互式判断连接断开

非阻塞模式下,建立连接没有调用send()和recv()进行数据交互的情况怎么判断服务端连接主动断开?

通过recv()函数,没有数据时返回-1,服务端断开返回0,通过返回0判断服务端是否断开

unsigned long  u32NonBlock = 1;

if ( ioctlsocket(pDlg->m_s32Socket, FIONBIO, &u32NonBlock) )     // 非阻塞

{

closesocket(pDlg->m_s32Socket);

pDlg->m_s32Socket = -1;

continue;

}

CHAR sTemBuf[2] = {0};

INT s32Ret = recv(pDlg->m_s32Socket,sTemBuf, sizeof(sTemBuf), 0);

if (0 == s32Ret) // 判断服务器是否主动断开 断开返回0

{

closesocket(pDlg->m_s32Socket);

pDlg->m_s32Socket = -1;

}

u32NonBlock = 0;

if ( ioctlsocket(pDlg->m_s32Socket, FIONBIO, &u32NonBlock) )     // 阻塞

{

closesocket(pDlg->m_s32Socket);

pDlg->m_s32Socket = -1;

continue;

}

时间: 2024-10-13 16:22:33

TCP连接在没有数据交互式判断连接断开的相关文章

Reachability.h (用于判定iPhone是否连接网络)和如何判断连接类型

+ (NSString *)getNetworkTypeFromStatusBar { NSString *networkType = @""; if (IOS_VERSION >= 7.0) { // http://www.cnblogs.com/wudan7/p/3587889.html CTTelephonyNetworkInfo *telephonyNetworkInfo = [[CTTelephonyNetworkInfo alloc] init]; LOG(@&quo

TCP socket如何判断连接断开

http://blog.csdn.net/zzhongcy/article/details/21992123 SO_KEEPALIVE是系统底层的机制,用于系统维护每一个tcp连接的. 心跳线程属于应用层,主要用于终端和服务器连接的检查. 即使SO_KEEPALIVE检测到连接正常,但并不能保证终端和服务器连接的正常.有一种情况,服务器进程死了,但它和客户端的tcp连接还连着(该连接由系统维护的). 这就是SO_KEEPALIVE不能取代心跳线程的原因吧. ###################

C# — WinForm TCP连接IPv4和IPv6的判断

大家都知道, XP系统默认使用的是IPv4格式的IP地址, 而Win7系统默认使用的是IPv6格式的IP地址. 所以有些关于TCP连接的WinForm系统,在XP下可能运行正常,但在Win7下却不能运行. 故,需要在进行TCP连接的时候,需要对IP地址格式进行一个判断. 代码如下所示: //获取本机所有IP地址 IPAddress[] localips = Dns.GetHostAddresses(Dns.GetHostName());foreach (IPAddress ip in local

TCP协议(包括TCP的连接过程,数据分段,TCP有关服务器优化)

Transmission Control Protocol/Internet Protocol 传输控制协议/因特网互联协议 TCP/IP是一个Protocol Stack(协议栈),包括TCP.IP.UDP.ICMP.RIP.TELNET.FTP.SMTP.ARP等许多协议,最早发源于美国国防部(缩写为DoD)的因特网的前身ARPA网项目,1983年1月1日,TCP/IP取代了旧的网络控制协议NCP,成为今天的互联网和局域网的基石和标准,由互联网工程任务组负责维护. TCP/IP共定义了四层和

IOS BLE4.0蓝牙和外设连接和收发数据的流程

前言: 苹果在IOS 6系统之后开始支持BLE 4.0,iPhone4s,iPod 5,iPad 3等之后的机型开始内嵌BLE4.0硬件,因此在开发前请先确认你的开发环境符合上述要求,并且苹果在BLE4.0之后,对外部的连接设备已经不在需要MFI认证了,当然你的外设肯定得要有蓝牙4.0模块了 综述: 开发BLE4.0的App,你需要在你的项目里面导入框架: CoreBluetooth.framework 在需要使用到蓝牙的文件里面你需要导入头文件: #import <CoreBluetooth/

TCP为何采用三次握手来建立连接,若采用二次握手可以吗

1. TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的.可靠的.基于IP的传输层协议,采用三次握手确认建立一个连接. TCP为了保证报文传输的可靠[1],就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收.然后接收端实体对已成功收到的字节发回一个相应的确认(ACK):如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传. 2. TCP协议三次握手过程分析 TCP是主机

ADO.NET 连接方式进行数据访问

1. 连接环境简介 1.1. 连接环境的特点 ? 连接环境是指用户在这种环境下始终保持与数据源的连接 ? 优点 –环境易于实施安全控制 – 同步问题易于控制 ? 数据实时性优于其他环境 ? 缺点 – 必须保持持续的网络连接 – 扩展性差 1.2. 连接环境下的对象模型 ? XxxConnection – 建立与数据源的连接,如SqlConnection 用于建立与Microsoft SQLServer? 的连接,OleDbConnection用于建立与任何支持OLEDB 的数据源的连接 ? Xx

【转】TCP建立连接三次握手和释放连接四次握手

在谈及TCP建立连接和释放连接过程,先来简单认识一下TCP报文段首部格式的的几个名词(这里只是简单说明,具体请查看相关教程) 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生:给字节编上序号后,就给每一个报文段指派一个序号:序列号seq就是这个报文段中的第一个字节的数据编号.  确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号:序列号表示报文段携带数据的第一个字节的编号:而确认号指的是期望接收到

SQL应用与开发:(五)多个数据表的连接

数据库中的各个表中存储着不同的数据,用户往往需要用多个表中的数据来组合.提炼出所需要的信息.如果一个查询需要对多个表进行操作,就称为连接查询.连接查询的结果集或结果表称为表之间的连接.查询实际上是通过各个表之间共同列的关联性来查询数据的,它是关系型数据库查询最主要的特征. 实现连接的结果是在向数据库增添新类型的数据方面没有限制,具有很大的灵活性.通常总是通过连接创建一个新表,以包含不同表中的数据.如果新表有合适的域,就可以将它连接到现有的表. 1.简单连接操作 最简单的连接方式是在SELECT语