代理项目中的慢速套接字读取()
Slow socket read() in proxy project
我正在为一个学校项目编写一个http 1.0 web代理。我已经完成了所有的工作,但我的read()
呼叫非常慢。我在read()
调用(来自C的stdlib的调用)周围放置了一个计时器。我看到一堆0秒的读数,然后是一个5到20秒的读数。这是在简单的高速网站上(谷歌,debian等)。在杂乱的网站上,事情会超时,页面永远不会加载(cnn,雅虎等)。
我从请求的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
#########
(包括末端的两条rn
线。)我读错了吗?还是我提出了一个糟糕的要求?在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;
}
您使用的是"Connection:keep-alive"行,该行告诉服务器您可能希望在同一连接上有多个请求。服务器将发送响应,并闲置在那里等待进一步的请求。如果没有连接,它最终会关闭连接。这可能就是你所看到的行为。如果您希望服务器在请求得到服务后关闭连接,请通过"连接:关闭"要求它关闭连接。对于保持活动连接(以及更高的性能),您确实应该使用HTTP/1.1并使用Content-Length标头。。。
相关文章:
- 套接字读取后,我在缓冲区中看到意外输入
- 将"uint8_t"(从套接字读取)隐式转换为"char"安全吗
- 不要从输入队列套接字读取数据
- 使用RAW套接字读取ICMP响应
- UDP 套接字读取最后一个传入字节
- CAN套接字读取帧较晚
- Java 套接字读取在第二次读取时返回奇怪字符
- 如何使用 recv 或 C++ 中的读取功能从 tcp 套接字读取大请求
- C++ 从末尾包含空字符的套接字读取字符串
- 是否可以在使用 Boost::asio 之前从套接字读取后执行async_handshake
- C++,在阻塞模式下从套接字读取所有可用字节的最佳方法
- 使用 QT 从套接字读取
- 如何检测我是否有要从套接字读取的内容?(c++)
- 为什么从套接字读取时 CAN 总线帧 ID 向后?
- 从套接字读取到缓冲区
- 从套接字读取和向套接字写入
- C 从套接字读取到std :: String
- JAVA:我无法从套接字读取文本,通过C++程序发送
- boost::asio 从套接字读取 n 个字节到 Streambuf
- 无法从TCP套接字读取