我正在为一个学校项目编写一个 http 1.0 网络代理。我已经完成了所有工作,但我的read()
通话速度很慢。我在呼叫周围放置了一个计时器read()
(来自 C 的 stdlib 的那个)。我看到一堆 0 读取,然后是一个需要 5-20 秒的读取。这是在简单的高速网站(谷歌、debian 等)上。在杂乱的网站上,事情会超时并且页面永远不会加载(cnn、yahoo 等)。
我正在从请求Host:
行打开一个到服务器的套接字,并从代理浏览器(在本例中为 firefox)写入确切的 GET 请求。写入需要 0。这是一个示例请求(哈希用于可视化)。
#########
GET http://debian.org/ HTTP/1.0
Host: debian.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:18.0) Gecko/20100101 Firefox/18.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
#########
(包括最后的两\r\n
行。)我读错了吗?还是我提出了错误的要求?在 chrome 中加载页面,甚至在 telnet 中使用 GET 请求都非常快。
这是读取的代码。“实际读取时间”输出通常类似于 0、0、...、0、15。
boost::shared_ptr<std::string> SocketBase::read(bool toEof) const
{
if (!this->isConnected())
{
Exceptions::raise<std::runtime_error>(__FILE__, __LINE__, "Socket is not connected.");
}
boost::shared_ptr<std::string> bytes = boost::shared_ptr<std::string>(new std::string());
while (toEof || bytes->rfind(CRLFCRLF) == std::string::npos)
{
char buffer[BufferSize];
time_t before = ::time(0);
int rc = ::read(this->socket, buffer, BufferSize);
time_t after = ::time(0);
std::cerr << "Actual read time: " << after - before << "s." << std::endl;
if (rc == 0)
{
break;
}
else if (rc < 0)
{
Exceptions::raise<Exceptions::ReadException>(__FILE__, __LINE__, ::strerror(errno));
}
else
{
bytes->append(buffer, buffer + rc);
}
}
return bytes;
}