我正在使用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;
};
CPP
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();
}
}
我想念的可能导致这个问题?
提前致谢。