语言 - > C ++ 11或C ++ 98 {NOT C}
操作系统 - > Linux嵌入式系统
的限制 - >不使用任何第三方库。
概述 - >与网站建立联系
我有一个Linux嵌入式系统,它不允许下载像poco或libcurl或boost这样的库来建立与网站的连接并提取信息。所以我想知道是否有人可以指导我如何在C ++ [not c]中纯粹通过原始套接字建立连接并从页面检索信息。
解析信息并检索确切信息对我来说不是一个挑战,我的主要问题是如何通过http协议建立连接。如果我是对的,要连接到网站我需要http协议而不是TCP / IP 有人可以指点我正确的方向。 感谢
答案 0 :(得分:3)
您可以使用原始TCP HTTP
与socket
进行通信。由于您没有提供代码,我也无法提供代码。如果您已经知道如何连接,发送和接收来自服务器的数据,那应该很容易。请按照以下步骤操作。
假设您要连接到www.cnn.com
。
<强> 1 即可。将网站的域名转换为IP地址。
<强> 2 即可。使用端口 80 连接到该IP地址。
第3 即可。发送字符串GET / HTTP/1.1\r\nHost: www.cnn.com\r\nConnection: close\r\n\r\n
<强> 4 即可。从套接字/服务器读取。如果服务器可用,它将使用该网页上的页面或html代码进行响应。
<强> 5 即可。关闭套接字连接。
请注意,如果您未提供正在使用的User-Agent
/ 网络浏览器名称,某些网站不会回复或甚至会阻止您。
要解决此问题,请在步骤添加中将User-Agent:MyBrowserName \r\n
标头添加到字符串中。你可以伪造浏览器。您必须在每个标题后添加\r\n
。
例如,我使用的Chrome浏览器是 Mozilla / 5.0(Windows NT 10.0; WOW64)AppleWebKit / 537.36(KHTML,如Gecko)Chrome / 48.0.2564.97 Safari / 537.36 。
您在步骤3中发送的新字符串应如下GET / HTTP/1.1\r\nHost: www.cnn.com\r\nConnection: close\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36\r\n\r\n
。您应该注意到每个标题后面都有\r\n
。最后一个标题以\r\n\r\n
而不是\r\n
结尾。
其他有用的标头是Connection: Keep-Alive\r\n
,Accept-Language: en-us\r\n
,Accept-Encoding: gzip, deflate\r\n
,
如果网站为https
而不是http
,请将 80 替换为 443 。事情变得复杂,因为你必须实现SSL
协议。
假设您要访问另一个目录中的页面而不是主页,并且网址为http://www.cnn.com/2016/05/13/health/healthy-eating-quiz/index.html
要发送的字符串应如下所示:
GET /2016/05/13/health/healthy-eating-quiz/index.html HTTP/1.1\r\nHost: www.cnn.com\r\nConnection: close\r\n\r\n
如果您使用的是代理,则必须在GET
命令之后输入整个网址:
GET GET http://www.cnn.com/2016/05/13/health/healthy-eating-quiz/index.html HTTP/1.1\r\nHost: www.cnn.com\r\nConnection: close\r\n\r\n