当前位置:  技术问答>linux和unix

一个关于socket长连接的问题

    来源: 互联网  发布时间:2017-04-24

    本文导语:  程序是用来和电信服务商进行长连接的,用的是电信的SMGP 3.0协议。 程序启动后,调用boost库的线程管理来启动一个线程函数SendData(string falg); m_threadpool.schedule(boost::bind(&SMGPCT::SendData,this,"SMGPCTMT")); 在线程函数SendData(s...

程序是用来和电信服务商进行长连接的,用的是电信的SMGP 3.0协议。
程序启动后,调用boost库的线程管理来启动一个线程函数SendData(string falg);
m_threadpool.schedule(boost::bind(&SMGPCT::SendData,this,"SMGPCTMT"));
在线程函数SendData(string falg)中,
做一个while(1)循环,里面先是调用ServerRecvTask()从中间件获取任务数据,
然后,若是没有数据,会进行30秒一次的链路测试ActiveTest(),问题就在这个链路测试中!
链路测试是先发送一个包给电信,然后等待电信的回执包,再由程序判断看回执包是否正确,
结果是如果隔的时间短的话,比如1-5秒之间,那么是收回的回执包是正确的,如果超过这个时间,比如之前设置的30秒,那么回执包怎么都不正确!
简单来说也就像下面这样:

SendData()
{
   while (1)
   {
      sleep(5); //正确的回执包
      //sleep(30);//错误的回执包
      ActiveTest();  
   }
}

ActiveTest()中的socket是用的Poco:Net中的StreamSocket

|
用sleep不合适吧,你应该是非阻塞socket+定时器来处理这个问题。sleep的话,sleep时间内,回执包没准就丢掉了。

|
有很多种方法的非阻塞,信号。但最简单的方法是用select非阻塞方式来实现,调用select时给定一个超时时间,在超时时间内如果收到数据你就读取,没收到就休眠。

|
首先你要知道数据在网路中存在是有时间限制的,如果你用sleep的话,那么就是阻塞状态,因为你说过:在没有数据的情况下,会进行30秒一次的链路测试ActiveTest(),那么在ActiveTest之前进行sleep的话,如果时间过长,就会出现数据丢失的状态,可以将ActiveTest放在sleep之前。

    
 
 

您可能感兴趣的文章:

  • 两个 Socket 互相通信,其中一个如何判断另一个 Socket 是否已经意外断开了连接?
  • socket 断开连接如何再恢复连接
  • 什么是socket的长连接,以及如何实现长连接,长连接和短连接有什么区别?
  • kjava能不能通过socket连接服务器
  • socket 连接问题(不要见笑)
  • 如何跨网段进行socket连接
  • socket连接建立,收不到告警的情况?netstat结果如下
  • 服务器与客户端建立socket连接,如何获得端口号.谢谢
  • ftp连接出现socket错误=#10054的解决方法
  • 如何清楚linux系统中以退出程序的socket连接?
  • Socket连接的时间不能控制??请帮小妹
  • http连接,服务器端关闭socket
  • 请问javaBean能不能进行非本机的socket连接
  • 200分求问j2me里如何建立socket连接?
  • Linux下的Socket通信如何断开连接的端口从而实现重复使用该端口
  • 一个进程打开的socket长连接能否达到10000个
  • socket怎样限制客户端连接数?
  • 关于LINUX SOCKET连接CPU占用问题
  • SOCKET调用close断开连接的时候回主动发FIN ACK包吗?
  • SOCKET 长连接
  • linux socket问题。。怎样获得已帮定特定port的一个套接字socket
  • 关于socket概念的理解问题!
  • socket编程 中的bind问题
  • 你是否可以回答Socket的问题?数据先后问题
  • 多进程socket编程问题
  • Socket的问题
  • socket accept问题,大家指教。
  • socket客户端程序的问题
  • 关于多网口socket通信的简单问题
  • fgets用在SOCKET流上的问题
  • linux socket fd 写阻塞问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • socket 通讯开发包 Simple Sockets
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • C++ Socket 库 C++ Sockets
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.net类socket的类成员方法: getreceivebuffersize定义及介绍
  • QSocketDevice ( int socket, Type type )中那个 int socket 是哪里来得?
  • java命名空间java.net类socket的类成员方法: gettrafficclass定义及介绍
  • socket编程 通过man socket, 没有找到socket函数的第一参数该填什么 怎样利用man手册
  • java命名空间java.net类socket的类成员方法: getport定义及介绍
  • 线程间可否通过管道传递SOCKET句柄?还有其他方式传递SOCKET么?
  • java命名空间java.net类socket的类成员方法: getlocalport定义及介绍
  • [FreeBSD] 大神,求解,control socket : can‘t to any socket
  • java命名空间java.net类socket的类成员方法: getinetaddress定义及介绍
  • 大家帮忙推荐一本linux socket编程的入门书,我刚接触socket,谢谢!!
  • java命名空间java.net类socket的类成员方法: isconnected定义及介绍
  • 我的ping程序怎么老是出现Socket operation on non-socket


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,