我有一个代码在c++中,我使用recv()从伯克利套接字接收数据从远程主机。问题是,我不知道数据的大小(这是可变的),所以我需要某种超时选择(可能)使这个工作。
因为我是新的套接字编程,我想知道如何例如web客户端处理响应从服务器(如服务器发送html数据到客户端)。它是否使用某种超时,因为它不知道页面有多大?FTP客户端也一样。
当您的数据是可变长度时,那么通常该数据将在另一个容器中进行框架。也就是说,在实际数据块之前有一个报头,告诉接收方应该接受多少数据。
例如,HTTP使用新的行字符来分隔数据。如果有可变长度的消息,那么在报头中它将包含"Content-length:"字段,该字段指示接收到整个报头后读取的确切字节数(当您读取连续的新行时报头停止)。
从套接字读取4个字节,获取随之而来的数据,然后再进行一次接收并读取其余的数据,这是完全可以的。只是要小心,当您请求4个字节时,套接字可能会给您1-4个字节之间的任何地方,因此任何小于4的内容都意味着您需要返回并请求剩余的几个字节。这是一个很常见的错误。在开发环境中,当你请求4个字节时,你几乎总是得到4个字节,但一旦你部署你的应用程序,在某些机器上的某个地方,你会随机崩溃,因为它们的网络行为在某种程度上是不同的。
一般来说,依靠超时来确定何时到达数据结束是一种糟糕的方法。使用超时,您可能会在控制良好的开发环境中"可靠地"工作,但这是一个非常不可靠的解决方案。任何CPU/磁盘/网络问题都可能导致应用程序过早停止接收。你也限制了你的数据吞吐量和响应能力,因为你的应用程序正在睡眠一段时间间隔,而不是工作。