客户端需要随时向服务端发送数据,每次都要连接服务端感觉不太好,想创建一个长连接一直连着,每次只Send就行。
该怎么创建长连接?

解决方案 »

  1.   

    用tcp连着,十分钟发送一个心跳包啊
      

  2.   

     #3楼 得分:0回复于:2010-07-19 17:13:24用tcp连着,十分钟发送一个心跳包啊 
     
    具体怎么发心跳包啊,能举个例子吗
      

  3.   

    不关闭在随后在做select、send、recv等操作时,返回-1
      

  4.   

    你用的是非阻塞模式吗,用WSAGetLastError获取返回码,判断啊
      

  5.   

    难道我
    connect了一个普通的socket
    不是长连接吗?
      

  6.   

    用TCP啊,TCP不就是长连接?直接调用SOCKET
      

  7.   

    建立连接后不关闭socket,当连接出现异常或关闭时,自动去重新连接服务器,异常检测是通过客户端与服务器之间的心跳来实现的
      

  8.   

    谁说的  一般路由器会每隔一段时间去检测连接是否有效  ROS路由器对于连接成功的就会等待24小时   
      

  9.   

    不关闭Socket ,过几分钟发一个心跳包就行了吧,不知道,试试
      

  10.   

    如果你连接socket成功建立好连接后,隔一段时间彼此不发送数据,估计会被路由器强制关闭的。
    必要的时候可以采用发送一点"心跳"数据。
      

  11.   


    对于发送保持连接的心跳包很简单,通常做法是发送一个空格字符,让TCP保持有效会话状态
      

  12.   

    要包含头文件#include <mstcpip.h> //KeepAlive实现 
    tcp_keepalive inKeepAlive = {0}; //输入参数 
    unsigned long ulInLen = sizeof(tcp_keepalive);  
    tcp_keepalive outKeepAlive = {0}; //输出参数 
    unsigned long ulOutLen = sizeof(tcp_keepalive);  
    unsigned long ulBytesReturn = 0;   //设置socket的keep alive为5秒,并且发送次数为3次   
    inKeepAlive.onoff = 1;  
    inKeepAlive.keepaliveinterval = 5000; //两次KeepAlive探测间的时间间隔 
    inKeepAlive.keepalivetime = 5000; //开始首次KeepAlive探测前的TCP空闭时间  if (WSAIoctl((unsigned int)Accept,
    SIO_KEEPALIVE_VALS,
    (LPVOID)&inKeepAlive, ulInLen,
    (LPVOID)&outKeepAlive, ulOutLen,
    &ulBytesReturn, NULL, NULL)
    == SOCKET_ERROR)
    {          
    strError.Format(_T("WSAIoctl failed. error code %d"), GetLastError());
    return 0;
    }
      

  13.   

    连接后不断开就是长连接,连接后做完了你想做的事然后断开就是短连接;
    长连接与短连接不是一个技术概念,不是什么connect("长连接")、connect("短连接"),而是你让他长着连就是长连接,你让他短着连就是短连接。
      

  14.   

    TCP/IP  你建立的连接就是长连接啊 只要你不把他关了  发心跳包 只是用来测试连接是否正常。可能对方断电了或者网线掉了的情况就需要 发心跳包,如果长时间对方没反应就说明 连接断了