如何处理套接字

How to process sockets

本文关键字:套接字 处理 何处理      更新时间:2023-10-16

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

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();
}

问题是,当StartSessionWrapper中的套接字接收时,负责处理嵌套Session中的套接字的循环也开始了。这也意味着现在没有办法处理来自SessionWrapper的任何StopSession(或其他命令)。

在c++ 11中,如果像上面那样使用两个不同的类(注意,套接字成员故意是私有的以强制封装),而不使用协程和多线程,如何优雅地解决这个问题?
如果可以帮助获得一个好的设计,那么可以使用boost。

您只需要异步处理Session

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

如果你能更好地描述你想达到的目标(而不是如何),我可能会更具体