我使用 curl 连接到一些服务器,然后该服务器发送一些我需要接收和输出的响应。我有以下代码,理论上应该执行上述功能:
void listen(CURL* curl)
{
char buf[1024];
size_t num;
curl_easy_recv(curl, buf, sizeof buf, &num);
std::cout << buf;
}
int main()
{
CURL* curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_perform(curl);
while (true)
listen(curl);
}
但是此代码仅输出从服务器接收到的第一个响应,仅此而已,没有其他任何事情发生,即使其他响应来自服务器,控制台上也不会显示任何内容,尽管它应该。告诉我我做错了什么以及如何解决?
据我了解,主要是初始化 curl 并在循环中调用一个通过 URL 请求页面的函数。
不过,网址保持不变。
事实上,在一个循环中,您会向服务器请求相同的页面。
这就是为什么你在循环中有相同的输出。
但是服务器可以非常聪明。例如,如果你访问某个 anecdote.ru 的 url “random anecdote”,那么你每次访问它都会有不同的轶事。
但是大多数情况下,对于同一个url,服务器返回的内容是一样的。
并且不知道您请求的是什么 URL - 我不能提前说明需要做什么才能转到下一个“数据部分”。
副手 - 在循环的每一步修改 url 会有所帮助。
比如这样一个url序列会连续打开几页habr文章列表:
https://habr.com/ru/all/
https://habr.com/en/all/page2/
https://habr.com/en/all/page3/
您的任务 - 当从任意站点请求时 - 由于许多站点在客户端构建页面这一事实而变得更加复杂。也就是说,一些最小的 js 代码被加载到浏览器中,然后开始向服务器发出请求并更改页面内容。curl 不能那样做——它是一个“愚蠢的摇杆”。
关于长池的补充
longpool 是非标准协议的一个很好的例子。该协议基于客户端连接到服务器的事实......并挂起。服务员没有回答他。但是当有一些信息需要传输给客户端时,服务器会将其“吐出”到客户端已经创建的连接中并结束会话。
客户端收到部分信息后,立即重新连接。并再次挂起。
微妙之处在于,服务器在连接时会分析客户端标头,并且在某些情况下可以简单地通过客户端代理的值“重击”它。很容易检查:您需要从浏览器启动连接并通过 fiddler 查看它,然后使用 curl 通过程序尝试相同的操作。如果同时会话非常不同,那么最好伪造标题:-)
这是一篇关于 longpool 的非常好的文章,不要因为它是关于 python 的事实而感到困惑 - c++ 会有变化,但基础知识已经正确设置。
如果文章没有帮助解决问题 - 请写一个你需要尝试“长拉”的特定 URL - 我可以尝试在某个晚上做。
希望我的回答对你有所帮助。