Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ TCPServer停止以接受连接_C++_Sockets_Tcp_Network Programming_Poco Libraries - Fatal编程技术网

C++ TCPServer停止以接受连接

C++ TCPServer停止以接受连接,c++,sockets,tcp,network-programming,poco-libraries,C++,Sockets,Tcp,Network Programming,Poco Libraries,我正在使用poco-1.5.2-all在TCP服务器上工作 它必须处理以下设备: 打开一个连接 发送数据 关闭连接 但我注意到,一段时间后,它不接受传入的连接。 代码如下: 标题: class TCPConnection : public Poco::Net::TCPServerConnection { public: TCPConnection(const Poco::Net::StreamSocket& s, DataHandler&

我正在使用poco-1.5.2-all在TCP服务器上工作

它必须处理以下设备:

  • 打开一个连接
  • 发送数据
  • 关闭连接
但我注意到,一段时间后,它不接受传入的连接。 代码如下:

标题:

class TCPConnection : public Poco::Net::TCPServerConnection {
public:
  TCPConnection(const Poco::Net::StreamSocket& s, 
                DataHandler&        data_handler,
                CommandDispatcher&  CmdDispatcher);
  ~TCPConnection();

  void run(void);
  void SendData(UINT8* data, UINT8 length);

private:
  CommandDispatcher&  m_CmdDispatcher;
  DataHandler&        m_data_handler;
  BOOL                m_running;
};


class TB_TCPServer : public Poco::Net::TCPServerConnectionFactory {
public:
  TB_TCPServer(DataHandler& data_handler);  
  ~TB_TCPServer();

  Poco::Net::TCPServerConnection* createConnection(const Poco::Net::StreamSocket& socket);

  int Start(unsigned short port);
  void Stop();

private:
  std::unique_ptr<Poco::Net::TCPServer> m_tcp_srv_ptr;
  std::unique_ptr<Poco::Net::TCPServerParams> m_pParams;

  DataHandler&          m_data_handler;
  CommandDispatcher     m_CmdDispatcher;
};
我错过了什么会导致这个问题


提前感谢。

您需要有多个线程来处理每个TCP连接。你能告诉我你创建的线程的确切数量吗?Hi@dvasanth,实际上TCPServerParams使用它的默认值。查看poco文档,我读到:“连接线程的数量是动态调整的,这取决于等待服务的连接数量。”因此我认为这个数字是自动选择的。因为我一分钟最多可以有30个连接,所以我必须将maxThreads设置为30吗?
TCPConnection::TCPConnection(const Poco::Net::StreamSocket& s, 
                             DataHandler&          data_handler,
                             CommandDispatcher&    CmdDispatcher) :
  Poco::Net::TCPServerConnection(s), 
  m_data_handler(data_handler),
  m_CmdDispatcher(CmdDispatcher),
  m_running(TRUE)
{
  MAIN_LOG.information(Poco::format("TCPConnection start (%s)", socket().peerAddress().toString()));
}

TCPConnection::~TCPConnection()
{
  m_running = FALSE;

  MAIN_LOG.information(Poco::format("TCPConnection end   (%s)", socket().peerAddress().toString()));
}

void TCPConnection::run(void)
{
  UCHAR buffer[RECEIVE_BUFFER_SIZE] = {0};
  UINT numRead = 1;

  Poco::Timespan timeOut(10,0);

  while(m_running)
  {
    try
    {
      if (socket().poll(timeOut, Poco::Net::Socket::SELECT_READ)) {

        numRead = socket().receiveBytes(buffer, RECEIVE_BUFFER_SIZE);

        if(numRead)
        {        
            ..... DOING WORK ....
        }
        else {
          m_running = false;
        }
      }
    }
    catch(Poco::Exception& e)
    {
      MAIN_LOG.error(Poco::format("   Socket Error:  (%s)", e.message()));
      m_running = FALSE;
    }
  }
}

void TCPConnection::SendData(UINT8* data, UINT8 length) {
  socket().sendBytes(data, length);
}



//----------------------------------------
//  TCPServer
//----------------------------------------
TB_TCPServer::TB_TCPServer(DataHandler& data_handler) : 
  m_data_handler(data_handler) {

  CommandProcessor::Ptr cmd(new SendParamsProcessor(data_handler));

  m_CmdDispatcher.SetCommandProcessor(APP_FONOMETRO, CMD_SEND_PARAMS, cmd);
}

TB_TCPServer::~TB_TCPServer() {
}

Poco::Net::TCPServerConnection* TB_TCPServer::createConnection(const Poco::Net::StreamSocket& socket) {
  return new TCPConnection(socket, m_data_handler, m_CmdDispatcher);
}

int TB_TCPServer::Start(unsigned short port) {

  MAIN_LOG.information(Poco::format("Starting TCP Server on port [%hu]", port));

  Poco::Net::ServerSocket svrSkt(port);

  //Configure some server params.
  m_pParams.reset( new Poco::Net::TCPServerParams() );
  //pParams->setMaxThreads(4);
  //pParams->setMaxQueued(4);
  //pParams->setThreadIdleTime(100);

  m_tcp_srv_ptr.reset( new Poco::Net::TCPServer(this, svrSkt, pParams) );

  m_tcp_srv_ptr->start();
  return 0;
}

void TB_TCPServer::Stop() {
  if (m_tcp_srv_ptr) {
    MAIN_LOG.information("Stopping TCP Server");
    m_tcp_srv_ptr->stop();
  }
}