等待直到收到所有数据,然后再发送另一个块

时间:2018-11-26 03:29:35

标签: sockets asynchronous networking gtk gio

我在Windows下使用GSocket。对于那些不知道的人,底层套接字本身就是winsock2型套接字句柄。

对于我的项目,我需要快速,异步(多线程,事件派生)的面向TCP流的文件传输,并且我需要通过仅在前一个块具有数据块时才发送数据块来在两侧之间引入同步行为已被远程用户接收(即套接字写缓冲区为空)。否则,发送大文件将迫使远程用户首先接收所有文件,直到他接收并处理其他数据包为止。我不想再次更改整个程序设计,例如更改为多路接口或实现多路复用协议。

一个简单的睡眠电话似乎有效。它使我能够同时处理文件传入的块,同时处理它们之间的其他数据包。不用说,这是一种非常强大的非解决方案,它是一种半解决方案。 我还尝试使用类似于著名的G_IO_OUT的包装程序来等待select()条件变为真。它的问题在于它允许发送三个块,然后由于无法再写入数据而永久冻结。 当可以使用非阻塞发送写入数据时,G_IO_OUT旨在被屏蔽。这有助于指示缓冲区是否已满,但不能指示缓冲区是否为空。 我想还值得一提的一点是,我绝对不想从接收方向发送方发送确认已接收到大块的确认。这增加了很多额外的复杂性,最终将进一步减慢文件传输的速度。

那么,在远程用户发送和接收所有当前数据之前,我应该怎么做才能阻止发送功能,而不会给接收器带来明显的延迟?


以下是我的架构如何工作以及如何工作的说明:

发件人:

  • 发送请求(FILE_PROPOSAL),其文件名大小应为
  • 发送文件名
  • 发送请求(FILE_INCOMMING)并包含期望的文件大小
  • 按块将文件发送到线程函数中,以便在发送调用之间引入同步延迟。在每个原始块之前发送带有类型+文件ID的FILE_CHUNK请求。

收件人:

  • 接收期望的文件名大小的请求(FILE_PROPOSAL)
  • 接收文件名
  • 接收请求(FILE_INCOMMING)和期望的文件大小
  • 分配一个包含文件信息(包括ID)的结构
  • 退货
  • 接收具有ID和块大小的FILE_CHUNK(s)请求,然后接收块本身,并将其附加到已分配结构中的已分配缓冲区中。
  • 返回,将控制权交给接收者以能够处理其他请求,

0 个答案:

没有答案