冲洗C++中的插座

Flush a socket in C++

本文关键字:插座 C++ 冲洗      更新时间:2023-10-16

在 c++ 中调用send函数后,我试图刷新套接字。
我用winsock2.h图书馆。

我需要在发送消息后立即发送数据,但我找不到任何像flash函数这样的功能。

我正在尝试向设备发送消息,它希望一一接收消息。
我的意思是,如果我在发送方发送两条消息,如"消息一"和"消息二",接收方收到的"消息一消息二"不是分开的,并且设备无法识别命令。

那我该怎么做呢?

在发送端,您无法使接收端"一个接一个"地接收消息。完全是接收方负责正确重建发送的帧("消息")。接收代码必须以某种方式知道消息长度(完全特定于协议),并接收尽可能多的数据以构建整个帧(通常通过发布具有指定长度的 recv 来实现,并指定仅对整个缓冲区感兴趣,例如。 MSG_WAITALL旗)。我发现很难相信您的设备不知道如何处理这个问题,如果确实是这种情况,那么您实际上能为力。我发现您更可能不了解设备/协议要求并且您问了错误的问题。

套接字没有"刷新"功能。如果您需要快速连续发送两条消息,则只需发送它们即可。如果是TCP套接字,那么它们将以正确的顺序(您发送它们的顺序)到达。

这种模式实际上并不少见;首先发送消息头,然后单独发送消息数据。

数据包方案问题的准确答案,示例来自 Winsock 常见问题解答

据我所知,确实没有"冲洗"能力。 send 函数返回发送的字节数,因此您可以迭代循环,直到发送所有字节。

编辑:为了补充我读到的内容,你想从其他用户那里得到。据我所知,增加"内部缓冲区"的唯一方法(刷新它是winsock自己做的事情)是setsockopt,使用so_sendbuf选项。

相关文章:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms740476%28v=vs.85%29.aspx

发送端将套接字选项设置为 NDELAY