1

我有一个关于winsock 的recv 功能的一般性问题。我编写了一个带有客户端/服务器架构的程序,其中客户端将相机图像发送到服务器,服务器将另一个图像发送回客户端。客户端发送多个图像,直到程序关闭。服务器将用另一个图像响应每个接收到的图像。

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

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

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

4

2 回答 2

4

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

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

信息:

  • 数据长度(32 位,无符号整数)
  • 数据内容
于 2010-09-28T13:41:04.913 回答
1

将您的图像数据包装在一个数据包中,该数据包由

  • 一个固定大小的标头,告诉后面有多少字节
  • 实际图像数据

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

省略了错误检查的示例代码;此外,您必须始终循环实际的 recv 调用,因为数据可能会分段到达!

unsigned bytesExpected;
Image imgData;
while( !LoopMustStop )
{
  Read( sizeof( unsigned ), bytesExpected );
  Read( bytesExpected, imgData );
  Process( bytesExpected, imgData )
}
于 2010-09-28T13:44:02.397 回答