Chinaunix

标题: KEEPALIVE 问题 [打印本页]

作者: liujq110    时间: 2009-03-26 17:51
标题: KEEPALIVE 问题
int keepAlive = 1; // 开启keepalive属性
int keepIdle = 18; // 如该连接在18秒内没有任何数据往来,则进行探测
int keepInterval = 5; // 探测时发包的时间间隔为5 秒
int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.


  这几个变量在.c 测试程序中编译执行 都没有问题,而且也有效

但在类文件的程序中,编译不过去,报的错误是什么 C++ 中不允许设置这几个参数
哪位大虾给指点 1,2  
  我想在类文件的程序中实用他们 ,怎样做,谢谢!!
作者: yangsf5    时间: 2009-03-26 18:48
你在类里怎么用的,帖下代码看看
作者: xinglp    时间: 2009-03-26 18:49
楼主很强悍
作者: xp5211314    时间: 2009-03-27 15:19
LZ 发个问题就闪人了 。。。。
作者: liujq110    时间: 2009-03-28 08:50
标题: 回复 #2 yangsf5 的帖子
真是不好意思 ,我上班的地方上网不方便,哎 真是 !见谅!
我的 部分代码

   //keepalive 事件间隔
       int keepAlive = 1; // 开启keepalive属性
       int keepIdle = 18; // 如该连接在18秒内没有任何数据往来,则进行探测
        int keepInterval = 5; // 探测时发包的时间间隔为5 秒
        int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.



          if(setsockopt(m_Accept_sd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive)) != 0)
          {
             printf("error code = %d,error string = %s \n", errno, strerror(errno));
             return FALSE;
          }

          if(setsockopt(m_Accept_sd, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle)) != 0)
          {
            printf("error code = %d,error string = %s \n", errno, strerror(errno));
            return FALSE;
          }

          if(setsockopt(m_Accept_sd, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval)) != 0)
          {
             printf("error code = %d,error string = %s \n", errno, strerror(errno));
             return FALSE;
          }

          if(setsockopt(m_Accept_sd, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount)) != 0)
          {
             printf("error code = %d,error string = %s \n", errno, strerror(errno));
             return FALSE;
          }
       这样设置就可以设置 keepalive 了

[ 本帖最后由 liujq110 于 2009-5-14 10:14 编辑 ]
作者: liujq110    时间: 2009-03-28 09:21
粘贴 后 代码好乱
作者: yangsf5    时间: 2009-03-28 12:49
标题: 回复 #5 liujq110 的帖子
呵呵,我猜到你是这样写的了,让你帖就是确定下。

这样是不行的。
类的成员不可以在类里初始化的。const 成员才可以。
作者: alexhappy    时间: 2009-03-28 13:09
JAVA倒可以这样做
作者: yangsf5    时间: 2009-03-28 13:09
更正上面的部分。

普通const成员也不行。

必须const static才可以,另外还必须这个const static 成员在类的定义体之外定义。
作者: liujq110    时间: 2009-03-28 14:24
标题: 回复 #9 yangsf5 的帖子
可以了 , 客户端和服务器要在不同的机器上测试, 拔网线 到了指定时间就可以检测到了  和 .c  .cpp  没有关系

[ 本帖最后由 liujq110 于 2009-5-14 10:10 编辑 ]
作者: liujq110    时间: 2009-03-28 14:25
标题: 回复 #3 xinglp 的帖子
请问 这样做是不可实现 还是 ????
作者: xinglp    时间: 2009-03-28 14:58
yangsf5说的对啊
作者: liujq110    时间: 2009-03-28 15:18
标题: 回复 #12 xinglp 的帖子
#include "COM_Head.h"
#include "COM_Macro.h"

#include "PUB_LogFile.h"
#include "THD_SocketServer.h"

//=============全局变量===========================

//=================================================================

CTHD_SocketServer::CTHD_SocketServer()
{
  m_strMsg = new char[STRMAXLEN];
  memset(m_strMsg, 0, STRMAXLEN);
        SOCKET = -1;
  //keepalive 事件间隔
  keepAlive = 1; // 开启keepalive属性
  keepIdle = 18; // 如该连接在18秒内没有任何数据往来,则进行探测
  keepInterval = 5; // 探测时发包的时间间隔为5 秒
  keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.

}


  在这里初始化    断网后等了好久也检测不到,好像是不起作用
作者: yangsf5    时间: 2009-03-28 16:37
看了你1楼的代码,
你把SO_KEEPALIVE这个选项在accept之后设置的。
这样不行,你可以看下UNP。
里边讲,开启某几个选项(包括SO_KEEPALIVE)必须在listen之前设置,新建立的socket继承listen_fd的这些选项。

ps:linux里可以这样改变SO_KEEPALIVE的默认属性吗?
我搜索的时候只找到windows可以这样。你要是成功能,给告知下。
作者: liujq110    时间: 2009-03-28 17:57
标题: 回复 #14 yangsf5 的帖子
呵呵 linux 下 用.c 的测试程序 成功了  呵呵  不过也 是在 accept 之后
作者: yangsf5    时间: 2009-03-28 18:09
标题: 回复 #15 liujq110 的帖子
啊?UNP不在手边,我再看看。:wink:
作者: liujq110    时间: 2009-03-28 21:23
标题: 回复 #16 yangsf5 的帖子
发现了一个很奇怪的事情:
同样的一个客户端连接两个不同的服务程序 ,客户端采用相同的非法关闭方式(连接上后不发任何消息,直接关闭客户端:不是close(fd),而是直接关掉客户端)。服务程序产生的事件是不一样的。

.c 的测试程序产生的事件是:EPOLLERR: events[n].events = 25  error code = 104,error string = Connection reset by peer


.cpp  产生的事件是:EPOLLIN: events.events = 25 奇怪  !!!
作者: yangsf5    时间: 2009-03-28 21:57
你测试都是这么测的吗?

  1. if( EPOLLIN)
  2. if( EPOLLERR)
复制代码


不能这样:

  1. if( EPOLLIN)
  2. else if(EPOLLERR)
复制代码

因为有些事件不止触发一个事件。当你写if分支的时候,人为的把它指向了谁在if分支的前边就打印显示只是谁了。
作者: liujq110    时间: 2009-03-28 22:04
标题: 回复 #18 yangsf5 的帖子
谢谢  跟你学了好多东西
作者: yangsf5    时间: 2009-03-28 22:09
标题: 回复 #19 liujq110 的帖子
呵呵,相互学习。。
我也只懂些皮毛。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2