5

我正在尝试使用 POCO C++ 库开发 TCP 服务器。我在这里找到了一些例子。起初我尝试了 Alex 的示例,但关闭事件不起作用。EchoServer 也有同样的问题。所以,然后我尝试了 Cesar Ortiz 示例并遇到了一个不寻常的问题。一段时间后服务器抛出错误:

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

并且连接出现连接超时错误,新连接也是如此。带有事件处理程序的示例似乎更正确,但我不知道如何修复关闭事件。

4

1 回答 1

14

如果您想要的只是多线程 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();
于 2013-05-15T00:10:50.903 回答