我们的团队正在 Windows 上实现 VNC 查看器(=VNC 客户端)。该协议(称为 RFB)是有状态的,这意味着查看器必须读取 1 个字节,看看它是什么,然后再读取 3 个或 10 个字节,解析它们,等等。
我们决定使用异步套接字和单个 (UI) 线程。因此,有两种方法:
1) 状态机——如果我们在读取套接字时遇到阻塞,只需记住当前状态并退出。稍后,套接字通知将到达,中断的逻辑将从正确的阶段恢复;
2)内部消息循环——一旦我们确定从套接字读取会阻塞,我们进入一个内部消息循环并在那里旋转直到最终接收到所有必要的数据。UI 不会因此在阻塞的情况下被冻结。
经验表明,第二种方法不好,因为当我们处于内部消息循环中时,任何消息都可能出现。我不能在这里讲述完整的故事,但它根本不够可靠。崩溃和kludges。
第一个选项似乎还可以接受,但要以这种风格进行编程并不容易。必须记住算法的状态和进一步处理所需的所有局部变量的值。
这很可能使用多线程,但我们只是认为这种情况下的问题会更加困难:帧缓冲区访问的同步、多线程问题等。此外,即使在这种变体中,似乎也有必要使用异步套接字也是如此。
那么,您认为最好的方法是什么?
这个问题很笼统。这就是通过有状态协议组织异步通信的问题。
编辑 1:我们使用 C++ 和 MFC 作为 UI 框架。