send
在调用C++中的函数后,我尝试刷新套接字。
我用winsock2.h
图书馆。
我需要在发送消息后立即发送数据,但我找不到任何类似函数的flash
功能。
我正在尝试向设备发送消息,并且它希望一一接收消息。
我的意思是,如果我在发送者中发送两条消息,如“MessageOne”和“MessageTwo”,接收者会收到不独立的“MessageOneMessageTwo”,并且设备无法识别命令。
那么我该怎么做呢?
send
在调用C++中的函数后,我尝试刷新套接字。
我用winsock2.h
图书馆。
我需要在发送消息后立即发送数据,但我找不到任何类似函数的flash
功能。
我正在尝试向设备发送消息,并且它希望一一接收消息。
我的意思是,如果我在发送者中发送两条消息,如“MessageOne”和“MessageTwo”,接收者会收到不独立的“MessageOneMessageTwo”,并且设备无法识别命令。
那么我该怎么做呢?
您无法在发送端做任何事情来让接收端“一个接一个”地接收消息。完全由接收方负责正确重建发送的帧(“消息”)。接收代码必须以某种方式知道消息长度(完全特定于协议)并接收尽可能多的数据以构建整个帧(通常通过发布具有指定长度并指定仅对整个缓冲区感兴趣的recv来实现,例如MSG_WAITALL
标志) . 我很难相信您的设备不知道如何处理这个问题,如果确实如此,那么实际上什么都没有你可以做。我发现您更有可能不了解设备/协议要求并且您提出了错误的问题。
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.
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
以Winsock 常见问题解答中的示例为您的数据包方案问题提供准确答案
在发送端将套接字选项设置为 NDELAY