判断SOCKET连接状态

1.用read函数来判断

读到长度0不能断定是已经断开.除非是-1,才代表输入流已经被关闭,说名socket已经close,而且关键在于你怎么读,实际上应该是一个单独的线程一直在读,因为你无法预先知道能不能一次将发过来的包读完,也无法知道一次是不是读完整了包,所以线称一直循环在读并且一直在解包.这样即能知道什么时候server断,也完成了消息的解读,我的方案是这样的,在大数据量高速率网络上运行没有发生过丢包

  1. //判断是否连接
  2. charch='A';
  3. if(read(g_sockfd,&ch,1)<=0)
  4. {
  5. if(connect(g_sockfd,(structsockaddr*)&g_serv_addr,sizeof(g_serv_addr))==0)
  6. {
  7. ServiceLog.write_log("[NotifyDAU]:connecttoDAUsuccess.");
  8. }
  9. else
  10. {
  11. ServiceLog.write_log("[NotifyDAU]:can'tconnecttoDAU");
  12. return;
  13. }
  14. }

用try{}catch{}是比较合适。

当他是连着的,当进行通讯时发生异常后就知道了.

当你不断的read的时候,server断,exception就catch到了。

2.心跳包

可不可以在Client设一个定时器,每隔一段时间发一条消息给服务器,看能不能收到服务器的响应。

心跳包就是定时发包,没回应就判断断开。

3. getsockopt

  1. intoptval,optlen=sizeof(int);
  2. getsockopt(sd,SOL_SOCKET,SO_ERROR,(char*)&optval,&optlen);
  3. switch(optval){
  4. case0:
  5. //“处于连接状态“
  6. break;
  7. caseECONNREFUSED:
  8. caseEHOSTNUMREACH:
  9. }

4.项目中使用的情况

  1. //判断是否连接
  2. intoptval,optlen=sizeof(int);
  3. intr=getsockopt(g_sockfd,SOL_SOCKET,SO_ERROR,(char*)&optval,&optlen);
  4. //sendHELLO包
  5. if((optval==0)&&(r==0)&&(send(g_sockfd,(char*)&g_DAUCommand,sizeof(struct_DAUCommand),0)!=SOCKET_ERROR))
  6. {
  7. ServiceLog.write_log("[threadOperationWaitTrasferAgain]:trytorecvfromdau...");
  8. length=recv(g_sockfd,(char*)&command,sizeof(struct_DAUCommand),0);
  9. }
  10. else
  11. {
  12. if(connect(g_sockfd,(structsockaddr*)&g_serv_addr,sizeof(g_serv_addr))==0)
  13. {
  14. ServiceLog.write_log("[threadOperationWaitTrasferAgain]:connecttoDAUsuccess.");
  15. ServiceLog.write_log("[threadOperationWaitTrasferAgain]:trytorecvfromdau...");
  16. length=recv(g_sockfd,(char*)&command,sizeof(struct_DAUCommand),0);
  17. }
  18. else
  19. {
  20. ServiceLog.write_log("[threadOperationWaitTransferAgain]:can'tconnecttoDAU,tryagain");
  21. length=0;
  22. continue;
  23. }
  24. }

http://blog.csdn.net/loadstar_kun/archive/2010/08/05/5790407.aspx


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值