如何处理套接字

时间:2015-07-11 21:35:19

标签: c++ c++11 boost boost-asio

我必须处理从两个套接字接收的数据。请考虑以下架构:

struct Session {
     Session() { /*...*/ }
     void process() {
          while (socket->recv()) {/*...*/}
     }
private:
     Socket* socket;
};

struct SessionWrapper {
     SessionWrapper() { /*...*/ }
     Command cmd;
     Session s{/*..*/};
     void process() {
          while ((cmd = socket->recv()) != Stop) {
               if (cmd == StartSession) {
                    s.process();
               } else if (cms == StopSession) {
                    // ...
                    break;
               }
          }
     }
private:
     SocketCmd* socket;
};

int main() {
     SessionWrapper w{/*...*/};
     w.process();
}

问题是当从Start中的套接字收到SessionWrapper时,负责处理嵌套Session中的套接字的循环也会启动。这也意味着现在无法处理来自SessionWrapper的任何StopSession(或其他命令)。

如何通过使用上面的两个不同的类来优雅地解决C ++ 11中的这个问题(请注意,套接字成员是故意私有的,以强制执行封装)并且不使用协同程序和多个线程?

如果有助于获得良好的设计,可以使用boost。

1 个答案:

答案 0 :(得分:1)

您只想异步处理Session

Boost Asio经常用于C ++中的异步IO。在这种情况下,您也需要一些方法来停止会话(图片中并不完全清楚)。

如果你更好地描述你正在尝试实现的目标(而不是如何)我可能会更具体