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
你测试都是这么测的吗?
if( EPOLLIN)
if( EPOLLERR)
复制代码
不能这样:
if( EPOLLIN)
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