如果你想要的是多线程的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();
感谢您的回复亚历克斯。正如我所说的,现在我使用第二个例子,但是我找不到'src/errorhandler.cpp'错误的原因。此服务器接受连接后,但不会为新连接发送或接收字节,并为现有连接抛出“连接超时”。 – 2013-05-15 05:15:01
您必须在连接处理程序的某处抛出异常。由于它在一个线程中运行,它将以默认错误处理程序结束。异常可能不是std :: exception的后代,所以ErrorHandler对此一无所知。但是你没有提供足够的信息来明确问题的答案。最好在调试器中运行你的代码,并逐步找出问题的根源。 – Alex 2013-05-15 14:21:59
正如我所说的,我使用Cesar Ortiz的例子,我只是改变了'运行'功能 - [这里](http://hastebin.com/lokadobeve.coffee)正如我发现的,当连接无法获取数据因为它在排队,但我不明白为什么?当前连接数达到16时,所有新连接将被添加到队列中,并在之后被拒绝。在params中,我设置了maxqueued(3),maxthreads(20)和threadidletime(100) – 2013-05-16 15:40:21