网络编程-HTTP
1.万维网
WWW:万维网
万维网是一个大规模的、联机式的信息储藏所(Web)
万维网服务器后台标记万维网数据:url:统一资源定位符
万维网客户端与万维网服务器之间的通信方式:HTTP:超文本传输协议(应用层)
万维网客户端展示请求的数据:HTML:超文本标记语言
(1)URL
URL的一般形式:
eg:
https://www.baidu.com/ 百度主页
HTTP:超文本传输协议(应用层)
默认端口号为80
备用端口号为8080
基于传输层的TCP协议
(2)HTTP通信过程
万维网的工作过程:
HTTP的报文结构:
HTTP有两类报文:
①请求报文——从客户向服务器发送请求报文
②响应报文——从服务器到客户的回答
HTTP是面向文本的,因此在报文中的每一个字段都是一些字符串,因而各个字段的长度都是不确定的。
HTTP的连接方式:
connection:keep-alive 长连接:连接保持一定时间
connection:close 短链接:立即断开连接
(3)爬虫
#include "head.h"#define SIN_PORT 80
#define SIN_ADDR "219.144.82.95"int create_tcp_connect()
{int sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd < 0){perror("socket error");return -1;}struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(SIN_PORT);seraddr.sin_addr.s_addr = inet_addr(SIN_ADDR);int ret = connect(sockfd,(struct sockaddr *)&seraddr, sizeof(seraddr));if(ret < 0){perror("connet error");return -1;}return sockfd;
}int send_http_request(int sockfd)
{char *p = "GET / HTTP/1.1\r\n""Host: news.sohu.com\r\n""User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/113.0\r\n""Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\n""Accept-Language: en-US,en;q=0.5\r\n""Connection: close\r\n""Upgrade-Insecure-Requests: 1\r\n""\r\n";ssize_t cnt = send(sockfd, p, strlen(p), 0);if(cnt < 0){perror("send error");return -1;}return 0;
}int recv_http_response(int sockfd)
{char buff[1024] = {0};while (1){ssize_t cnt = recv(sockfd, buff, sizeof(buff), 0);if(cnt < 0){perror("recv error");return -1;}if(0 == cnt){printf("server close");break;}write(1, buff, cnt);}}int main(int argc, char const *argv[])
{int sockfd = create_tcp_connect();if(sockfd < 0){return -1;}send_http_request(sockfd);recv_http_response(sockfd);close(sockfd);return 0;
}