winsock的recv功能

时间:2010-09-28 13:36:16

标签: c client winsock recv

我有一个关于winsock的recv函数的一般性问题。 我编写了一个带有客户端/服务器架构的程序,客户端将摄像头图像发送到服务器,服务器将另一个图像发送回客户端。 客户端发送多个图像,直到程序关闭。并且服务器将使用其他图像响应每个接收到的图像。

客户端(发送)---->服务器(接收)---->服务器(发送)---->客户(接收)。 ^的 _ __ _ __ _ __ _ ____ LOOP _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ _ |

我的问题是服务器接收功能。如果我使用512Byte大缓冲区多次调用接收函数,我怎么知道我收到了整个图像? 我发现的例子只是等到连接关闭(recv返回0),但我希望在不关闭连接的情况下接收多个图像。但是如果我收到缓冲区中没有任何字节,recv函数将暂停线程直到有新的字节(但这不会发生,因为服务器首先想要在接收之前将自己的图像发送回客户端下一个)。

那么是否有可能告诉服务器整个图像已被接收,以便它可以将自己的图像发送回客户端而无需等待下一个字节或关闭连接?

2 个答案:

答案 0 :(得分:4)

开发一个带有标题的协议,其中包含接收方必须预期的数据量n。接收器仅从TCP流中读取头部PLUS n字节(由头部指示)。然后你可以期待下一个标题。如果您没有收到n个字节,则传输不完整。

简而言之,您可以在协议中定义一条消息,如下所示:

消息:

  • 数据长度(32位,无符号整数)
  • 数据内容

答案 1 :(得分:1)

将图像数据包装在由

组成的数据包中
  • 一个固定大小的标题,告知将跟随多少字节
  • 实际图像数据

在您的接收代码中,您首先阅读标题部分,读取适当数量的数据。

省略错误检查的示例代码;你也必须总是循环实际的recv调用,因为数据可能会分成几个部分!

unsigned bytesExpected;
Image imgData;
while( !LoopMustStop )
{
  Read( sizeof( unsigned ), bytesExpected );
  Read( bytesExpected, imgData );
  Process( bytesExpected, imgData )
}