【发布时间】:2012-03-17 15:45:22
【问题描述】:
需要异步 I/O 处理
计划在 Linux 上通过 aio* 调用使用异步 I/O
情况:
我已经打开了带有 AF_INET 和 SOCK_STREAM 标志的套接字 (TCP) 发送缓冲区有限制高水位线 想要异步写入那个socket,当发送缓冲区溢出时,想要断开一个socket
所以,我有问题:
当我对 TCP 套接字上的 aio_write 进行异步调用时,当 I/O 完成将到达时 - 当缓冲区写入套接字缓冲区或确认交付时?我该如何管理这种行为?
如何使用 lio_listio 技术最好地处理这个问题
问候, 安德鲁
【问题讨论】:
-
出于兴趣,您看过 boost asio 吗?
-
不确定 Linux。在 Windows 上,MSDN:“成功完成 WSASend 并不表示数据已成功交付”。 TBH,我对此感到惊讶 - 如果数据尚未成功交付,可能需要重新发送。如果内核、驱动程序等返回尚未确认的缓冲区,则它们必须保留数据的副本,因此失去了排队用户缓冲区的“不复制”优势:((
-
@MartinJames:它不保证成功完成使用
WSASend()函数的返回值。等待适当的通知(回调、I/O 完成通知等)以获取传输的实际结果。这并不意味着您不能使用无复制,您只需要等待传输完成,然后再重新使用该特定缓冲区。 -
@AndréCaron - 好的,所以 WSASend 的完成通知(至少使用 TCP)表示成功交付?
-
@MartinJames:这表明,就操作系统的最佳知识而言,内容是按请求发送的。完成通知与调用同步
send()函数的结果基本相同。我对低级 TCP 确认以及操作系统何时确切告诉您它发送了数据不是很了解,所以我不确定这个结果是否意味着数据已成功传递(如,确认收到来自对等方)。