gpt4 book ai didi

c++ - 如何确保 WSASend() 将发送数据?

转载 作者:搜寻专家 更新时间:2023-10-31 01:01:38 24 4
gpt4 key购买 nike

WSASend() 会立即返回是否发送数据。但是如何确保数据将被发送,例如我的 UI 中有一个按钮,按下时将发送 "Hello World!"。现在我想确保当用户点击这个按钮时,“Hello World!” 将在某个时候发送,但是 WSASend() 可以返回 WSAEWOULDBLOCK 表示数据不会被发送,所以我应该将 WSASend() 包含在一个循环中,直到 WSASend() 返回 0 (成功)。

注意:我正在使用 IOCP。

最佳答案

should I enclose WSASend() in a loop that does not exit until WSASend() returns 0 (success)

错误.. 不!

让 UI 发出重叠的 WSASend 请求,完成 buffer/s 和 OVERLAPPED/s。如果出现奇迹,它确实立即返回成功(我从未见过),那你就很好了。

如果 (when:),它返回 WSA_IO_PENDING,您将无法在 UI 按钮处理程序中执行任何操作,因为 GUI 事件处理程序无法等待。图形用户界面是状态机 - 您必须退出按钮处理程序并以提示方式返回消息输入队列。如果你愿意,你可以做一些 GUI 的事情。也许禁用“发送”按钮,或将一些“消息已发送”文本添加到备忘录组件。就是这样 - 然后你必须退出。

一段时间后,成功完成通知(或失败通知)将发布到 IOCP 完成队列,处理程序线程将获取它。使用 PostMessage、QueueUserAPC 或类似的线程间通信机制将“某物”(例如,原始 WSASend 中使用的缓冲区对象)发回 UI 线程,以便它可以对返回的结果采取行动,例如。重新启用“发送”按钮。

是的,它看起来很乱,但这是唯一有效的方法。

其他方法 - 轮询循环、Application.DoEvents、计时器等都是可怕的障碍。

关于c++ - 如何确保 WSASend() 将发送数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28752103/

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