我在Windows下使用GSocket。对于那些不知道的人,底层套接字本身就是winsock2型套接字句柄。
对于我的项目,我需要快速,异步(多线程,事件派生)的面向TCP流的文件传输,并且我需要通过仅在前一个块具有数据块时才发送数据块来在两侧之间引入同步行为已被远程用户接收(即套接字写缓冲区为空)。否则,发送大文件将迫使远程用户首先接收所有文件,直到他接收并处理其他数据包为止。我不想再次更改整个程序设计,例如更改为多路接口或实现多路复用协议。
一个简单的睡眠电话似乎有效。它使我能够同时处理文件传入的块,同时处理它们之间的其他数据包。不用说,这是一种非常强大的非解决方案,它是一种半解决方案。
我还尝试使用类似于著名的G_IO_OUT
的包装程序来等待select()
条件变为真。它的问题在于它允许发送三个块,然后由于无法再写入数据而永久冻结。
当可以使用非阻塞发送写入数据时,G_IO_OUT
旨在被屏蔽。这有助于指示缓冲区是否已满,但不能指示缓冲区是否为空。
我想还值得一提的一点是,我绝对不想从接收方向发送方发送确认已接收到大块的确认。这增加了很多额外的复杂性,最终将进一步减慢文件传输的速度。
那么,在远程用户发送和接收所有当前数据之前,我应该怎么做才能阻止发送功能,而不会给接收器带来明显的延迟?
以下是我的架构如何工作以及如何工作的说明:
发件人:
收件人: