我正在尝试使用POCO C ++库开发TCP服务器。 我找到了一些例子here。 起初我尝试了亚历克斯的例子,但是关机事件没有用。 EchoServer也有同样的问题。 所以,然后我尝试了Cesar Ortiz的例子并得到了一个不寻常的问题。一段时间后服务器抛出错误:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
["src/ErrorHandler.cpp", line 60]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
连接出现连接超时错误,新连接也是如此。 使用eventhandler的示例更正确,但我不知道如何修复关闭事件。
答案 0 :(得分: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();