URL:统一资源定位符
urlencode将字符用ASCII码转化显示
urldecode将ASCII码解码为字符
http基于请求响应
客户端发起请求,服务端响应请求,然后断开连接
请求协议格式:
请求行:方法(GET/POST) URL HTTP版本(1.1)
请求报头:name:value(以行为单位)
name:value
name:value
空行:\n->\r\n
正文:(具体数据也可能不存在)
响应协议格式:
状态行:http版本 状态码 状态码描述
响应报头:name:value(以行为单位)
name:value
name:value
空行:\n->\r\n
正文: HTML/IMAG/CSS/JS/...
http的方法:
GET:获取资源
POST:传输实体主体
PUT:传输文件
HEAD:获得报文首部
。。。
http状态码
:
1XX 信息性状态码 接收的请求正在处理
2XX 成功状态码 请求正常处理完毕
3XX 重定向状态码 需要进行附加操作以完成请求
4XX 客户端错误状态码 服务器无法处理请求
5XX 服务器错误状态码 服务器处理请求出错
http常见的header
Content-Type:数据类型
Content-length: 正文长度
Host:客户端告诉服务器,资源在哪个端口
Cookie:用于客户存储少量信息,通常用于实现会话(session)的功能
。。。
简单的http服务器程序示例
1 #include <sys/socket.h>
2 #include <netinet/in.h>
3 #include <arpa/inet.h>
4 #include <unistd.h>
5 #include <string.h>
6 #include <stdlib.h>
7
8 void Usage()
9 {
10 printf("usage: ./server [ip] [port]\n");
11 }
12
13 int main(int argc,char* argv[])
14 {
15 if(argc!=3)
16 {
17 Usage();
18 return 1;
19 }
20
21 int fd = socket(AF_INET,SOCK_STREAM,0);
22
23 if(fd<0)
24 {
25 perror("socket");
26 return 2;
27 }
28
29 struct sockaddr_in addr;
30 addr.sin_family = AF_INET;
31 addr.sin_port = htons(atoi(argv[2]));
32 addr.sin_addr.s_addr = inet_addr(argv[1]);
33
34 int ret = bind(fd,(struct sockaddr*)&addr,sizeof(addr));
35
36 if(ret<0)
37 {
38 perror("http");
39 return 3;
40 }
41
42 ret = listen(fd,1);
43
44 while(1)
45 {
46 struct sockaddr_in client_addr;
47
48 socklen_t len = sizeof(client_addr);
49
50 int client_fd = accept(fd,(struct sockaddr*)&client_addr,&len);
51
52 if(client_fd<0)
53 {
54 perror("accept");
55 continue;
56 }
57
58 char* input_buf[1024*10] = {0};
59 ssize_t read_size = read(client_fd,input_buf,sizeof(input_buf)-1);
60
61 if(read_size<0)
62 {
63 perror("read");
64 return 4;
65 }
66
67 printf("[requset] %s",input_buf);
68
69 char buf[1024]={0};
70 const char* hello = "<h1>hello world</h1>";
71
72 sprintf(buf,"HTTP/1.0 200 ok\nConnect-Length:%lu\n\n%s,strlen(hello),hello");
73
74 write(client_fd,buf,strlen(buf));
75 }
76 return 0;
77 }
通过浏览器访问效果: