纯粹通过原始套接字连接连接到网站

时间:2016-05-14 19:45:54

标签: c++ linux sockets http c++11

语言 - > C ++ 11或C ++ 98 {NOT C}
操作系统 - > Linux嵌入式系统
限制 - >不使用任何第三方库。 概述 - >与网站建立联系 我有一个Linux嵌入式系统,它不允许下载像poco或libcurl或boost这样的库来建立与网站的连接并提取信息。所以我想知道是否有人可以指导我如何在C ++ [not c]中纯粹通过原始套接字建立连接并从页面检索信息。

解析信息并检索确切信息对我来说不是一个挑战,我的主要问题是如何通过http协议建立连接。如果我是对的,要连接到网站我需要http协议而不是TCP / IP 有人可以指点我正确的方向。 感谢

1 个答案:

答案 0 :(得分:3)

您可以使用原始TCP HTTPsocket进行通信。由于您没有提供代码,我也无法提供代码。如果您已经知道如何连接,发送和接收来自服务器的数据,那应该很容易。请按照以下步骤操作。 假设您要连接到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\nAccept-Language: en-us\r\nAccept-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