2013-05-12 112 views
6

我正在尝试开发一个带有POCO C++库的TCP服务器。我发现一些例子here。 起初我试过Alex的例子,但关机事件没有奏效。 EchoServer有同样的问题。 因此,我尝试了塞萨尔奥尔蒂斯的例子,并得到了一个不寻常的问题。一段时间后,服务器将引发一个错误:带POCO C++库的多线程TCP服务器

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
["src/ErrorHandler.cpp", line 60] 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

和连接了连接超时错误,新的连接也是如此。 事件处理程序示例semeed更正确,但我不知道如何修复关闭事件。

回答

12

如果你想要的是多线程的TCP服务器,然后在“开箱即用” Poco::Net::TCPServer会做 - 它是多线程的内部。 与定义连接启动,这一个只会回显你送什么给它:

class EchoConnection: public TCPServerConnection { 
public: 
    EchoConnection(const StreamSocket& s): TCPServerConnection(s) { } 

    void run() { 
    StreamSocket& ss = socket(); 
    try { 
     char buffer[256]; 
     int n = ss.receiveBytes(buffer, sizeof(buffer)); 
     while (n > 0) { 
     ss.sendBytes(buffer, n); 
     n = ss.receiveBytes(buffer, sizeof(buffer)); 
     } 
    } 
    catch (Poco::Exception& exc) 
    { std::cerr << "EchoConnection: " << exc.displayText() << std::endl; } 
    } 
}; 

然后,运行服务器,并将其发送一些数据:

TCPServer srv(new TCPServerConnectionFactoryImpl<EchoConnection>()); 
srv.start(); 

SocketAddress sa("localhost", srv.socket().address().port()); 
StreamSocket ss(sa); 
std::string data("hello, world"); 
ss.sendBytes(data.data(), (int) data.size()); 
char buffer[256] = {0}; 
int n = ss.receiveBytes(buffer, sizeof(buffer)); 
std::cout << std::string(buffer, n) << std::endl; 

srv.stop(); 
+0

感谢您的回复亚历克斯。正如我所说的,现在我使用第二个例子,但是我找不到'src/errorhandler.cpp'错误的原因。此服务器接受连接后,但不会为新连接发送或接收字节,并为现有连接抛出“连接超时”。 – 2013-05-15 05:15:01

+0

您必须在连接处理程序的某处抛出异常。由于它在一个线程中运行,它将以默认错误处理程序结束。异常可能不是std :: exception的后代,所以ErrorHandler对此一无所知。但是你没有提供足够的信息来明确问题的答案。最好在调试器中运行你的代码,并逐步找出问题的根源。 – Alex 2013-05-15 14:21:59

+0

正如我所说的,我使用Cesar Ortiz的例子,我只是改变了'运行'功能 - [这里](http://hastebin.com/lokadobeve.coffee)正如我发现的,当连接无法获取数据因为它在排队,但我不明白为什么?当前连接数达到16时,所有新连接将被添加到队列中,并在之后被拒绝。在params中,我设置了maxqueued(3),maxthreads(20)和threadidletime(100) – 2013-05-16 15:40:21