c++ - 带 POCO C++ 库的多线程 TCP 服务器

标签 c++ poco poco-libraries

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

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

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

最佳答案

如果您只需要多线程 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();

关于c++ - 带 POCO C++ 库的多线程 TCP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16510205/

相关文章:

c++ - 使用Poco库时出错

c++ - 检测 WM_MOUSEMOVE 是否由触摸/笔引起

c++ - 使用 CMake 制作后如何将目录的内容复制到构建目录中?

c++ - 如何忽略某些套接字请求

c# - 从 xml 文件生成 POCO 对象

wcf - 带有 WCF 属性的 Entity Framework 5.0 DBContext 模板支持

wcf - Ado.net Entity Framework 2010 中的 POCO 类是否需要 DataContract 属性

timezone - Poco 使用错误的时区

c++ - Poco::Logger 不记录跟踪或调试级别的日志,仅记录信息级别及以上

C++从文本文件读取到数组/字符串