Acceptor的问题

darkstar21cn 2004-10-25 02:18:50
在ACE文档上是说:Acceptor框架中,只有一个新的连接进来的时候才会调用HANDLER的open (void* reactor)方法。

可以现在我的程序有问题了:open ()方法似乎一定时间就被重新调用一下,而且之前没有任何断开连接。
另外我的程序在内部调试的时候是没有种情况出现的。

我目前采用的解决方案是,当有新连接时,看看这个连接的IP是否已经连接了,如果连接了不以处理。但是这只是权宜之计。
望有高手指点!
...全文
236 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
darkstar21cn 2004-11-01
  • 打赏
  • 举报
回复
晕又是第三次了,没人帮忙顶下吗?
darkstar21cn 2004-10-29
  • 打赏
  • 举报
回复
如果还有需要什么信息的,请说。我尽量把信息无关的代码贴出来
darkstar21cn 2004-10-29
  • 打赏
  • 举报
回复
int handle_input (ACE_HANDLE handle)
{
ACE_UNUSED_ARG (handle);

char buffer[INPUT_BUFFER_SIZE];//INPUT_BUFFER_SIZE = 2048
ACE_OS::memset (buffer, 0, sizeof buffer);

ACE_Time_Value t = ACE_Time_Value::zero;
ssize_t read = peer ().recv (buffer, :INPUT_BUFFER_SIZE, &t);
if (read < 0) {
ACE_ERROR_RETURN ((LM_ERROR, "%M [%t %N:%l] Can not receive any byte from socket. Return value is %d \n", read), -1);
}
else if (read == 0) {
ACE_ERROR_RETURN ((LM_ERROR, "%M [%t %N:%l] Read 0 byte from socket.\n"), -1);
}
else {
#ifdef BCR_DEBUG_ENABLE
time_t now = time (0);
//TODO: print what has received from primary server
ACE_DEBUG ((LM_DEBUG, "%M [%t %N:%l] receive message:\n%s\nTIME: %s\n", buffer, ctime (&now)));
#endif
this->input_buf += buffer; //ACE_CString input_buf -- member variable
this->process_input (); //deal with input_buf
}
return 0;
}

process_input ()
是把消息处理一下把到一个队列中等待另一个线程的处理(具体代码涉及客户信息,不能贴出来)。
mgphuang 2004-10-29
  • 打赏
  • 举报
回复
我猜是不是你的input挂钩方法阻塞住了,导致所谓的"饥饿",反应器处理超时,才会重新确认接连.
freefalcon 2004-10-27
  • 打赏
  • 举报
回复
有人解释一下ACE是什么吗?

——
ACE:Adaptive Communication Environment
一个用C++实现的可移植的网络通信中间件
参见http://www.cs.wustl.edu/~schmidt/ACE-overview.html

darkstar21cn 2004-10-27
  • 打赏
  • 举报
回复
open很简单就是把新的连接放到一个map中,便于我后面使用。
darkstar21cn 2004-10-27
  • 打赏
  • 举报
回复
这是我的读取函数
handle_input (ACE_HANDLE handle)
{
ACE_UNUSED_ARG (handle);
size_t n = 64;
char buf[64];
ACE_OS::memset (buf, 0, sizeof buf);
ACE_Time_Value t = ACE_Time_Value::zero;
ssize_t ret = this->peer ().recv (buf, n, &t);
if ( ret <= 0) {
ACE_ERROR_RETURN ((LM_ERROR, "%M [%t %N:%l] Failed to get any byte from socket\n"), -1);
}
time_t now = time (0);
#ifdef BCR_DEBUG_ENABLE
ACE_DEBUG ((LM_DEBUG, "%M [%t %N:%l] reviece message:\n%s\nTime: %s", buf, ctime (&now)));
#endif
//If it has read any from the connection for some time, I would disconnect it.
this->last_read_time = now;

/**
If recive the Second servers ip, and if it is valid ip replace the old which was gotten form the connection with it
*/

/*deal with the message
........
*/
return 0;
}
darkstar21cn 2004-10-27
  • 打赏
  • 举报
回复
没有人有话说了?
这样不太好吧?

另:客户端是用Connector框架进行连接的。
dudu妈 2004-10-26
  • 打赏
  • 举报
回复
我也不会,等待高手来帮忙解决,到时候也可以多学点知识
darkstar21cn 2004-10-26
  • 打赏
  • 举报
回复
沉了?
自己顶一下。
darkstar21cn 2004-10-26
  • 打赏
  • 举报
回复
不是,我只注册了一个READ事件。既然这个问题这么长时间没人人回答,那我问另一个问题吧:

使用ACE连接,有什么方法可以让客户端断线以后尝试重新连接,直至连接成功。

——任何建议都可以,不是ACE的也可以,我可以想方法该成用ACE实现。请有经验的人踊跃发言,UP有分,如有可行的建议另外开贴给分。
lynnboy 2004-10-26
  • 打赏
  • 举报
回复
有人解释一下ACE是什么吗?
sharkhuang 2004-10-26
  • 打赏
  • 举报
回复
不熟悉。我觉得你注册read事件。read出错就再重头开始注册连接事件。
Visual_Li 2004-10-26
  • 打赏
  • 举报
回复
帮顶混分
roy 2004-10-26
  • 打赏
  • 举报
回复
帮你顶。。。
wshcdr 2004-10-26
  • 打赏
  • 举报
回复
帮顶下
goodluckyxl 2004-10-26
  • 打赏
  • 举报
回复
我用的windows下的
我没有发现过这个问题

要不你换试试
linux下我也不太会能力有限
就不多言了
darkstar21cn 2004-10-26
  • 打赏
  • 举报
回复
难道是版本问题,我们公司的redhat Linux是9.0的,而客户的是redhat fedora。在我们内部测试的时候没有遇到过这个问题。
goodluckyxl 2004-10-26
  • 打赏
  • 举报
回复
把你的主要的代码给我看看
我ACE也了解的很肤浅
不一定能解决
来^_^
darkstar21cn 2004-10-26
  • 打赏
  • 举报
回复
一开始,我也以为是客户端尝试重连,但经过调试,并没有发现想要的重连信息。
加载更多回复(5)

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧