1.用read函数来判断
读到长度0不能断定是已经断开.除非是-1,才代表输入流已经被关闭,说名socket已经close,而且关键在于你怎么读,实际上应该是一个单独的线程一直在读,因为你无法预先知道能不能一次将发过来的包读完,也无法知道一次是不是读完整了包,所以线称一直循环在读并且一直在解包.这样即能知道什么时候server断,也完成了消息的解读,我的方案是这样的,在大数据量高速率网络上运行没有发生过丢包
- //判断是否连接
- charch='A';
- if(read(g_sockfd,&ch,1)<=0)
- {
- if(connect(g_sockfd,(structsockaddr*)&g_serv_addr,sizeof(g_serv_addr))==0)
- {
- ServiceLog.write_log("[NotifyDAU]:connecttoDAUsuccess.");
- }
- else
- {
- ServiceLog.write_log("[NotifyDAU]:can'tconnecttoDAU");
- return;
- }
- }
用try{}catch{}是比较合适。
当他是连着的,当进行通讯时发生异常后就知道了.
当你不断的read的时候,server断,exception就catch到了。
2.心跳包
可不可以在Client设一个定时器,每隔一段时间发一条消息给服务器,看能不能收到服务器的响应。
心跳包就是定时发包,没回应就判断断开。
3. getsockopt
- intoptval,optlen=sizeof(int);
- getsockopt(sd,SOL_SOCKET,SO_ERROR,(char*)&optval,&optlen);
- switch(optval){
- case0:
- //“处于连接状态“
- break;
- caseECONNREFUSED:
- caseEHOSTNUMREACH:
- }
4.项目中使用的情况
- //判断是否连接
- intoptval,optlen=sizeof(int);
- intr=getsockopt(g_sockfd,SOL_SOCKET,SO_ERROR,(char*)&optval,&optlen);
- //sendHELLO包
- if((optval==0)&&(r==0)&&(send(g_sockfd,(char*)&g_DAUCommand,sizeof(struct_DAUCommand),0)!=SOCKET_ERROR))
- {
- ServiceLog.write_log("[threadOperationWaitTrasferAgain]:trytorecvfromdau...");
- length=recv(g_sockfd,(char*)&command,sizeof(struct_DAUCommand),0);
- }
- else
- {
- if(connect(g_sockfd,(structsockaddr*)&g_serv_addr,sizeof(g_serv_addr))==0)
- {
- ServiceLog.write_log("[threadOperationWaitTrasferAgain]:connecttoDAUsuccess.");
- ServiceLog.write_log("[threadOperationWaitTrasferAgain]:trytorecvfromdau...");
- length=recv(g_sockfd,(char*)&command,sizeof(struct_DAUCommand),0);
- }
- else
- {
- ServiceLog.write_log("[threadOperationWaitTransferAgain]:can'tconnecttoDAU,tryagain");
- length=0;
- continue;
- }
- }
http://blog.csdn.net/loadstar_kun/archive/2010/08/05/5790407.aspx
分享到:
相关推荐
Linux或Windows下判断socket连接状态 测试代码
Android Socket连接,包含心跳检测,断线重连,数据发送等等 博客地址:http://blog.csdn.net/yuzhiqiang_1993/article/details/78094909
本文链接:https://blog.csdn.net/tt1995cc/article/details/70770042在用QT写服务端时想要知道客户端是否断开
Android Socket连接,包含心跳检测,断线重连,数据发送等等 博客地址:http://blog.csdn.net/yuzhiqiang_1993/article/details/78094909
在 VB.NET 中它不允许我们使用 Winsock 的 State 属性来判断连接状态,唯一可用的是 SocketHandle 属性,当 Winsock 为开启时它的值为 -1,但是 Connect() 之后就无法从其值判断连接状态了,这是我们可以变换一下...
本文实例讲述了C#使用Socket快速判断数据库连接是否正常的方法。分享给大家供大家参考。具体分析如下: 大家在做项目的时候,一般都是和数据库有关的。而相信许多人在用代码打开数据库的时候,没有判断数据库连接...
如果不主动关闭socket的话,系统不会自动关闭的,除非当前进程挂掉了,操作系统把占用的socket回收了才会关闭。小编今天跟大家简单介绍下如何在C语言中判断socket是否已经断开
而且他需要知道每台计算节点的任务状况,因此服务器节点必须存储与所有计算节点的socket连接对象。 在客户端唯一需要知道的就是它归属的调度服务器的通信IP和端口,因此client是发送连接的主动方,由调度服务器...
在无网或网速差的状态下,没必要去连接服务器。 你可以使用 ConnectivityManager 来判断是否连到网络,以及网络类型。 判断是否有网络连接 下面的代码用ConnectivityManager查询是活动网络连接判断是否有Internet...
使用WinSocket实现的UDP数据通讯,一套代码可实现双方通讯,一个dll可被两个exe同时加载,实现一台计算机上的进程间通讯,当然,也可以放在不同的计算机上实现数据通讯,可跨操作系统
一个基于WPF + SuperSocket的TCP长连接小示例 SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架。你无须了解如何使用 Socket, 如何维护 Socket 连接和 Socket 如何工作,我们可以有更...
实时检测网络的通断情况,以实现网络的无缝重连
可以实用的 C# Socket 通讯例子, socket server 接收图片并保存图片 socket client 发送图片,使用 MemoryStream。 包括:本机获取本机IP,判断client连接状态,以及如何抓屏等等。
//进入侦听状态 if(listen(serverSocket,SOMAXCONN)==SOCKET_ERROR){ printf("侦听失败!"); exit(-1); } printf("Server %d is listening......\n",port); SOCKET clientSocket[5],maxSocket;//用来和...
西门子下位机PLC连接示例程序,S7connector。使用java语言实现
SanNiuSignal是一个基于异步socket的完全免费DLL;它里面封装了Client,Server以及UDP;有了这个DLL;用户不用去关心心跳;粘包 ;组包;发送文件等繁琐的事情;大家只要简单的几步就能实现强大的通信系统;能帮助到...
/// SocketSession 客户端Socket连接会话类,保存会话信息,接收处理数据,返回数据给客户端。 /// 主要2个线程: /// 监听客户端连接的线程,监听所有客户端的链接创建并分配会话。 /// 会话遍历线程,遍历会话列表...
客户端:使用Android Studio进行界面设计和开发,利用Socket建立与服务器的TCP连接,实现实时通信。 服务器端:Java编写服务器程序,使用Socket监听客户端连接,处理游戏逻辑和数据交换。 数据库:使用SQLite或其他...