繁体   English   中英

POCO连接被卡住

POCO connection gets stuck

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在使用POCO反应堆模式来处理传入的TCP连接。 连接可能需要几秒钟到几分钟,具体取决于请求类型,如下所示:

  try{
    ServerSocket serverSocket(port);
    reactor = new SocketReactor();
    ParallelSocketAcceptor<BFSTcpServiceHandler,SocketReactor> acceptor(serverSocket, *reactor);
    //Start Reactor
    reactor->run();
  }catch(Exception&e){
    LOG(ERROR)<<"ERROR in initializing TCPServer:"<<e.message();
    return;
  }

这是处理程序:

BFSTcpServiceHandler::BFSTcpServiceHandler(StreamSocket& _socket,
    SocketReactor& _reactor): socket(_socket),reactor(_reactor) {
  //Set Keeep Alive for socket
  socket.setKeepAlive(false);

  //Register Callbacks
  reactor.addEventHandler(socket, NObserver<BFSTcpServiceHandler,
    ReadableNotification>(*this, &BFSTcpServiceHandler::onReadable));
  /*reactor.addEventHandler(socket, NObserver<BFSTcpServiceHandler,
    WritableNotification>(*this, &BFSTcpServiceHandler::onWriteable));*/
  reactor.addEventHandler(socket, NObserver<BFSTcpServiceHandler,
    ShutdownNotification>(*this, &BFSTcpServiceHandler::onShutdown));
  reactor.addEventHandler(socket, NObserver<BFSTcpServiceHandler,
    ErrorNotification>(*this, &BFSTcpServiceHandler::onError));
  reactor.addEventHandler(socket, NObserver<BFSTcpServiceHandler,
    TimeoutNotification>(*this, &BFSTcpServiceHandler::onTimeout));
  /*reactor.addEventHandler(socket, NObserver<BFSTcpServiceHandler,
    IdleNotification>(*this, &BFSTcpServiceHandler::onIdle));*/
}

BFSTcpServiceHandler::~BFSTcpServiceHandler() {
  //Unregister Callbacks
  reactor.removeEventHandler(socket, NObserver<BFSTcpServiceHandler,
    ReadableNotification>(*this, &BFSTcpServiceHandler::onReadable));
    ...
  //Close socket
  try {
    socket.close();
  }catch(...){}
}

void BFSTcpServiceHandler::onReadable(
    const Poco::AutoPtr<Poco::Net::ReadableNotification>& pNf) {
  //LOG(ERROR)<<"onReadable:"<<socket.peerAddress().toString();
  try{
   //Read and process request
  } catch(Exception &e){
    LOG(ERROR)<<"Error in reading request:"<<e.message();
    delete this;
  }
  //So after a connection is served just close it!
  delete this;
}

void BFSTcpServiceHandler::onShutdown(
    const Poco::AutoPtr<Poco::Net::ShutdownNotification>& pNf) {
  LOG(ERROR)<<"onShutdown:"<<socket.peerAddress().toString();

  //Call destructor of this class
  delete this;
}

void BFSTcpServiceHandler::onWriteable(
    const Poco::AutoPtr<Poco::Net::WritableNotification>& pNf) {
  static bool once = true;
  if(once) {
    LOG(ERROR)<<"onWritable:"<<socket.peerAddress().toString()<<" keepAlive?"<<socket.getKeepAlive()<<" isBlocking?"<<socket.getBlocking()<<" noDeley?"<<socket.getNoDelay();
    once = false;
  }
}

void BFSTcpServiceHandler::onTimeout(
    const Poco::AutoPtr<Poco::Net::TimeoutNotification>& pNf) {
  LOG(ERROR)<<"\nTIMEOUT! onTimeout:"<<socket.peerAddress().toString();
}

void BFSTcpServiceHandler::onError(
    const Poco::AutoPtr<Poco::Net::ErrorNotification>& pNf) {
  LOG(ERROR)<<"\nERROR! onError:"<<socket.peerAddress().toString();
}

void BFSTcpServiceHandler::onIdle(
    const Poco::AutoPtr<Poco::Net::IdleNotification>& pNf) {
  LOG(ERROR)<<"\nIDLE! onIdle:"<<socket.peerAddress().toString();
}

代码工作正常; 但是,过了一会儿它卡住了,这意味着服务器确实接受了连接,但是根本不再调用onReadable。 例如,卡住后,我可以远程登录到服务器,但是当我发送数据时,onReadable不会被触发。 使用netstat,我意识到一些数据被保留在RCV_QEUEUE中,而且反应堆不会触发onReadable事件。

我认为这是由于达到系统的连接/文件限制所致,但是当系统卡住时,实际上并没有打开多少连接。

任何意见或帮助表示赞赏。

谢谢,

1 个回复

问题出在使用有故障的NIC /驱动程序。 我将代码更改为常规POSIX套接字,并遇到了相同的问题,并且通过切换NIC解决了该问题。 我不确定这是驱动程序还是硬件问题。

1 与 Poco 库的 Websocket 连接

我对 wss://www.bitmex.com/realtime 的 websocket 连接有问题。 我在这个问题中找到了一个例子: Connect Websocket with Poco libraries ,但我不能用我的 wss:// 地址做同样的事情。 我总是在字符串后收到异常:“找 ...

2 我可以将POCO对象与实体连接吗

如果我有一个对象列表,这些对象的属性应该与实体字段的值匹配,那么可以在这样的联接中使用此对象(使用linqpad进行测试): 由于某种原因,我认为这将无法工作,因为它已转换为sql。 该查询似乎在Linqpad中花费了很长时间,并且要翻译的sql(至少我可以看到),而它试图执行的SQL似 ...

4 使用Poco的MySQL连接失败

我在C ++,Ubuntu(12.04)和MySQL 5.5 x64上使用Poco(1.5.2 ver)。 我尝试使用以下代码连接到MySQL: 但是有一个MySQLException: 错误:MySQL 这是什么意思 ? 有谁可以帮助我吗? 谢谢 !! ...

5 保持断开连接的POCO实体

我正在处理断开的POCO对象。 当我保留单个对象时,它可以正常工作! 当我要保留相关对象时,问题就开始了。 例如: 从数据层检索对象: 该对象返回到业务层,在那儿,我添加了一些子记录,请参见下文(仅用于说明): 权限是对用户权限的导航。 然后,我想将 ...

7 Android线程连接卡住

我在应用程序中运行线程连接: 但是在某些设备中当thread.join(); 所谓的应用程序被卡住了(但是线程没有启动),你知道是什么原因引起的吗? ...

8 JSch SFTP 连接卡住

我们有一个 java 7 代码库,我们使用Apache commons vfs2 v2.2 ,它使用JSch-0.1.54作为 sftp 提供程序。 现在,用例是通过 sftp 将文件传输到远程主机。 但是,文件上传过程时不时会卡住。 在获取应用程序的线程转储后,我们发现两个线程( t1 ,将数据 ...

10 AWS Cloud9 卡住连接

我的 AWS Cloud9 实例从昨天开始就一直在连接。 它给出了错误: “这花费的时间比预期的要长。延迟可能是由于您环境中的 CPU 使用率过高,或者您的 T2 或 T3 实例的可突增 CPU 容量积分用完,或者存在 VPC 配置问题” 我尝试将实例类型更改为更大的实例类型。 我也试过重启。 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM