现在要开发一个网络通讯客户端程序,用的是TCP/IP协议,具体的协议已经拟订好了。简单的描述及时每隔30秒客户端自动向服务器端传输一组数据。因为我的客户端机器要一天24小时不停的运行,而且是无人值守的,那万一网络中断或是服务器端关机等异常情况发生,导致连接中断时,我的客户端程序必须保证在服务器端启动后,客户端能自动连接上服务器。我现在不清楚该怎么设置connect函数,才能做到这一点。
还有,对于这种程序,我该采用多线程阻塞模式好呢,还是采用非阻塞模式好些?对于我这一点,我始终都确定不了别人都是采取哪种方法实现的?
如果我要在程序中发送心跳包的话,该怎么做呢?
对网络编程了解得不多,还请高手给指点一下。多谢。

解决方案 »

  1.   

    我的一点看法客户端可以考虑发送心跳包
    客户端每30秒就向服务器发送数据
    其实这个跟心跳包的能达到的作用差不多了这样在tcp连接出错时能够通过发送数据发现与主机断开连接
    接下来在上面重新调用连接函数就可以了
    我现在不清楚该怎么设置connect函数,才能做到这一点。我建议不要把自动重连的功能加到connect函数里。
      

  2.   

    哪位有采用TCP/IP协议,利用API开发的socket程序,多线程阻塞模式的,让我学习一下。网上没搜到很贴切的。在多线程中使用socket我始终不知道该怎么入手。
      

  3.   

    按我看LZ应该用UDP协议更适合。
      

  4.   

    按我看LZ应该用UDP协议更适合。
    ///UDP协议是非可靠的传输,我的这个程序必须保证数据能准确地传输到服务器端,必须用TCP
      

  5.   

    既然“必须用TCP”,那就用吧。
      

  6.   

    关于发送心跳包的问题,我有些疑惑。心跳包是为了让服务器端能随时知道客户端是否断开,那是不是客户端一定要向服务器端发送心跳包?难道服务器端不可以通过其它方式知道与客户端的连接状态吗? 
    发送心跳包有固定的规范吗?
    Tcp建立连接后,虽然断开连接会有响应
    但是如果是异常,比如服务器突然停电关机,网络故障等
    有可能不会响应断开连接,或不能及时响应
    但是,如果网络确实断了,发送数据就可以(即刻)检测出来
    所以要发送心跳包
      

  7.   

    感觉有点和QQ通信类似,LZ可以截包分析QQ的做法
      

  8.   

    连接断开后重新连接,如果连接失败就延时一段时间后重试.如果连接成功,客户端能收到FD_CONNCET通知,
      

  9.   

    别把心跳当的太...  最简单点就是你问我答,在N秒(超时内没有向我报告) ,就认为断掉 closesocket ,  如果在N秒内有报告,就重新计时 .就这样 tcp 要是异常断开超时会很长,.不能用一般的recv <= 0判断网络断开 或者 send > 0判断链路是好的.