赞
踩
服务端读到两个连续的\r\n之后,就表示正文开始了
(1)Get:向服务端索要某些资源,也可以给服务端提交较少的数据(url中)
为什么是较少的?因为url的长度是有限制的,不能无限制给服务端提交数据在查询字符串当中
(2)Post:提交某些数据,提交的数据是在请求正文当中传输给服务端
对比Get与Post方法:
Post方法比Get方法更加私密,不能说Post方法比Get方法更加安全,因为不管Get发送在url当中提交的数据,还是Post方法在请求正文中提交数据,都是明文传输。
(3)Head:获取响应头部信息,并没有获取响应正文,为了测试请求资源是否有效
(4)Put:传输文件的方法
(5)Delete:删除文件
对于Put和Delete,http都没有校验,一般情况下,后台的服务端都是不支持Put和Delete方法的
(6)Options:询问服务端支持的方法
HTTP:超文本传输协议,是无连接、无状态,工作在应用层的协议
无连接:http协议本身是不建立连接的,但是http的数据会提交给传输层的tcp协议,tcp协议在传输数据的时候是需要建立连接的
无状态:http协议本身是对请求和响应不做保存的,现在双方的状态是服务端在实现的机制(会话机制)
http/0.9:初代的http协议,使用并不广泛
http/1.0,http/1.1:常用
http/2.0:正在制定中
常见的状态码及解释
(1)200 OK :服务端将请求处理完毕了
(2)302 Found :临时重定向
(3)404 Page Not Found :访问的页面不存在
(4)502 Bad Getway :坏的网关
Content-Type:正文的类型
Content-Length:正文的长度
Host:保存服务端的ip和端口信息
User-Agent:保存操作系统和浏览器版本的信息
Location:保存重定向的网页地址
Connection:keep-alive:保持长连接(http底层使用到的tcp保持长连接)
Cookie
#include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sstream> using namespace std; int main() { int listen_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(listen_sock < 0) { perror("socket"); return 0; } struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(28989); //0.0.0.0 : 本地所有的网卡地址 addr.sin_addr.s_addr = inet_addr("0.0.0.0"); int ret = bind(listen_sock, (struct sockaddr*)&addr, sizeof(addr)); if(ret < 0) { perror("bind"); return 0; } ret = listen(listen_sock, 1); if(ret < 0) { perror("listen"); return 0; } struct sockaddr_in cli_addr; socklen_t cli_addrlen = sizeof(cli_addr); int newsockfd = accept(listen_sock, (struct sockaddr*)&cli_addr, &cli_addrlen); if(newsockfd < 0) { perror("accept"); return 0; } printf("accept new connect from client %s:%d\n", inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port)); while(1) { //接收 char buf[1024] = {0}; ssize_t recv_size = recv(newsockfd, buf, sizeof(buf) - 1, 0); if(recv_size < 0) { perror("recv"); continue; } else if(recv_size == 0) { printf("peer close connect\n"); close(newsockfd); return 0; } printf("%s\n", buf); memset(buf, '\0', sizeof(buf)); string body = "<html><h1>bite welcome</h1></html>"; stringstream ss; ss << "HTTP/1.1 302 Found\r\n"; //ss << "Content-Type: text/html\r\n"; //ss << "Content-Length: " << body.size() << "\r\n"; ss << "Location: https://www.baidu.com/\r\n"; ss << "\r\n"; send(newsockfd, ss.str().c_str(), ss.str().size(), 0); send(newsockfd, body.c_str(), body.size(), 0); } close(listen_sock); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。