2

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

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

我正在尝试向设备发送消息,并且它希望一一接收消息。
我的意思是,如果我在发送者中发送两条消息,如“MessageOne”和“MessageTwo”,接收者会收到不独立的“MessageOneMessageTwo”,并且设备无法识别命令。

那么我该怎么做呢?

4

5 回答 5

6

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

于 2012-10-10T08:36:40.853 回答
1

There is no "flush" functionality for sockets. If you need to send two messages in rapid succession then just send them. If it's a TCP socket then they will arrive in the correct order (the order you send them in).

This pattern is actually not uncommon; First send a message header followed by a separate send of the message data.

于 2012-10-10T08:15:07.273 回答
0

To my knowledge there really isn't a "flush" ability. the send function returns how many bytes are sent, so you could iterate a loop until all the bytes are sent.

Edit: To add to what I've read you want from other users. The only way I know of to increase the "internal buffer" (flushing it is something winsock does on its own) is setsockopt, using the so_sendbuf option.

Article relating to it:

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

于 2012-10-10T08:15:15.623 回答
0

以Winsock 常见问题解答中的示例为您的数据包方案问题提供准确答案

于 2012-10-10T08:26:05.380 回答
0

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

于 2016-02-18T14:56:19.627 回答