linux http查看网页,【Linux C/C++】 第09讲 HTTP协议与浏览器显示网页

实现多线程文件传输之后,就可以尝试去实现浏览器显示自定义网页

因为浏览器访问服务器端的网页是根据HTTP/HTTPS协议的

这需要先去了解HTTP/HTTPS协议

实际上就是一种数据格式,数据包发送和接收的格式

浏览器会自动进行格式排列发出,自动解析收到的数据包进行显示

一、HTTP协议

1.1 URL

URL的全称是Uniform Resource Locator (统一资源定位符)

通过1个URL,能够找到互联网上唯一的1个资源

URL就是资源的地址、位置,互联网上的每个资源都有唯一的URL

URL的基本格式:协议://主机地址/路径

1.2 协议

HTTP协议 -超文本传输协议,访问的是远程的网络资源,最常用

file协议 -访问的是本地计算机上的资源

mailto协议 -访问的是电子邮件的地址

FTP协议 -访问的是共享主机的文件资源

1.3 HTTP简介

规定客户端和服务器传输数据的格式

9b462651fa855dddf91ce64c245c2132.png

完整的http通信可以分为2大步骤:

1> 请求: 客户端向服务器索要数据

2> 响应: 服务器返回客户端相应的数据

发送http请求的方法,在http/1.1协议中,定义了8种

GET、POST、OPTIONS、HEAD、PUT、

DELETE、TRACE、CONNECT、PATCH

常用的只有GET和POST

二、HTTP协议实现

然后按回车键发出请求

服务器的公网地址:119.23.71.163

端口:18888

请求显示的页面:Tomo.html

发出的请求数据包是按照一个特定格式排列的

浏览器会自动组包,并发给服务器

一个http请求报文由

请求行(request line)、请求头部(header)、空行和请求数据

4个部分组成,具体格式如下:

37c3223729a2e52f61cb479386fd0843.png

GET /Tomo.html HTTP/1.1

Host: 119.23.71.163:18888

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-cn

Connection: keep-alive

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/601.7.7 (KHTML, like Gecko) Version/9.1.2 Safari/601.7.7

程序实现:

constchar* domain_name ="www.baidu.com";

host = gethostbyname(domain_name);

intlen=0;

sprintf(buf_get,"GET %s HTTP/1.1\r\n",path);

len = strlen(buf_get);

sprintf(&buf_get[len],"%s","Accept: */*\r\n");

len = strlen(buf_get);

sprintf(&buf_get[len],"Host: %s\r\n",domain_name);

len = strlen(buf_get);

sprintf(&buf_get[len],"%s","Connection: keep-alive\r\n\r\n");

len = strlen(buf_get);

send(fd,buf_get,len);

服务器端收到请求数据包之后,需要自己按照格式编写

应该给浏览器发送指定的网页响应数据包

然后浏览器进行自动解析并显示

响应数据包格式,响应报文由4个部分组成:

状态行、响应头部、空行和响应包体

e7ed38126a4c671658b05910c4e8b59a.png

HTTP/1.1 200 OK

Server:skynet

Content-Type:text/html;charset=utf-8

Content-Length:948

Connection:keep-alive

程序实现:

sprintf(buffer,"%s","HTTP/1.1 200 OK\r\n");

size = strlen(buffer);

sprintf(&buffer[size],"%s","Server:skynet\r\n");

size = strlen(buffer);

sprintf(&buffer[size],"Content-Type:%s%s\r\n",content_type,charset);

size = strlen(buffer);

sprintf(&buffer[size],"%s%d\r\n","Content-Length:",length);

size = strlen(buffer);

sprintf(&buffer[size],"%s","Connection:keep-alive\r\n\r\n");

size = strlen(buffer);

//data - 打开服务器上的html文件,读取并发送

//此处略去了文件的打开和读取,读者自行参考之前的文章

intloc =0;

while(length >0)

{

//printf("loc:%d\n",loc);

intlen = length >1024?1024: length;

buffer = (char*)malloc(len);

memcpy(buffer,&buffer_html[loc],len);

send(fd,buffer,len);

length -= len;

loc += len;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值