2015-07-11 94 views
0

我必須處理從兩個套接字接收的數據。考慮以下方案:如何處理套接字

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

的問題是,當從插座收到SessionWrapperStart,負責在嵌套Session處理插座的循環開始了。這也意味着現在將無法處理來自SessionWrapper的任何StopSession(或其他命令)。

如何在C++ 11中通過使用兩個不同的類(請注意套接字成員故意專用於強制封裝)並且不使用協程和多線程來優雅地解決此問題?

如果可以幫助獲得良好的設計,可以使用boost。

+0

爲什麼指針?兩個類是否共享相同的套接字? – DanielKO

+0

@DanielKO:套接字是不同類型的,它們不共享相同的套接字。他們是指針,但他們不可能,我不認爲這很重要(這就是爲什麼我把/*...*/放在構造函數中,假設他們是以某種方式創建的) – Martin

+1

你爲什麼要調用'process( )'遞歸?這沒有意義。在收到開始會話命令之前,即使有SessionWrapper類的實例也沒有意義。這只是一個代碼結構問題。 – EJP

回答

1

你只是想異步處理Session

Boost Asio通常用於C++中的異步IO。在這種情況下,您需要一些方法來停止會話(圖片中並不完全清楚)。

如果你更好地描述你想達到什麼(不如何)我可能會更具體