C++ TCPServer停止以接受连接
我正在使用poco-1.5.2-all在TCP服务器上工作 它必须处理以下设备: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&
- 打开一个连接李>
- 发送数据李>
- 关闭连接
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();
}
}