gpt4 book ai didi

c++ - 在完成端口调用 WSASend()?

转载 作者:太空狗 更新时间:2023-10-29 19:53:23 26 4
gpt4 key购买 nike

你们中的许多人都知道原始的“send()”不会将您要求的字节数写入线路。您可以轻松地使用指针和循环来确保您的数据已全部发送。

但是,在这种情况下,我看不到 WSASend() 和完成端口是如何工作的。它立即返回,您无法控制发送了多少(除了您在例程中可以访问的 lpLength)。如何解决这个问题?

您是否必须在例程中多次调用 WSASend() 才能获取所有数据?这不是一个很大的缺点吗,尤其是当您希望数据以特定顺序输出并且多个线程访问例程时?

最佳答案

当您调用 WSASend 时使用与 IOCP 关联的套接字和一个 OVERLAPPED结构你有效地传递你的数据到网络堆栈发送。一旦网络堆栈不再需要您使用的数据缓冲区,网络堆栈将为您提供“完成”。届时,您可以自由重用或释放用于数据缓冲区的内存。

请注意,数据不太可能在生成完成时到达对等点,完成的生成仅意味着网络堆栈已取得缓冲区内容的所有权。

这与send的方式不同运作。与 send在阻塞模式下调用 send将阻塞,直到网络堆栈使用了您提供的所有数据。调用 send在非阻塞模式下,网络堆栈从您的缓冲区中获取尽可能多的数据,然后返回给您有关它使用了多少数据的详细信息;这意味着您的一些数据已被使用。与 WSASend ,通常情况下,您的所有数据都会在您收到通知之前被使用。

重叠的 WSASend 是可能的由于资源限制或网络错误而失败。出现故障是不常见的,这表明一些数据已发送但不是全部。通常它全部发送 OK 或根本没有发送。然而,有可能得到一个错误的完成,这表明一些数据已被使用,但不是全部。从这一点开始的方式取决于错误(临时资源限制或硬网络故障)以及其他多少 WSASend s 你在那个套接字上有待处理(零或非零)。如果您遇到临时资源错误并且没有其他 Unresolved 问题,您只能尝试发送其余数据 WSASend调用此套接字;并且由于您不知道临时资源限制情况何时会过去这一事实而变得更加复杂......如果您有临时资源限制引起的部分发送并且您确实有其他WSASend调用挂起,那么您可能应该中止连接,因为您可能通过发送来自此 WSASend 的缓冲区的一部分来混淆数据流调用,然后是后续 WSASend 的全部(或部分)打电话。

请注意,拥有多个 WSASend 是 a) 有用且 b) 高效的在套接字上调用未完成的。这是保持连接充分利用的唯一方法。但是,您应该了解多个重叠的内存和资源使用影响 WSASend由于 TCP 流控制问题,一次挂起的调用(请参阅 here )有效地将缓冲区的生命周期控制权(以及代码使用的内存和资源量)交给对等方)。参见 SIO_IDEAL_SEND_BACKLOG_QUERYSIO_IDEAL_SEND_BACKLOG_CHANGE如果你想变得非常聪明......

关于c++ - 在完成端口调用 WSASend()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14347708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com