总述
本项目实现了Linux系统下一个简易Web服务器要求:
- 当一个客户(浏览器)连接时,创建一个连接套接字;
- 从这个连接套接字接收 HTTP 请求;
- 解释该请求以确定所请求的特定文件;
- 从服务器的文件系统获得请求的文件;
- 创建一个由请求的文件组成的 HTTP 响应报文,报文前面有首部行;
- 经 TCP 连接向请求浏览器发送响应;
- 如果浏览器请求一个在该服务器中不存在的文件,服务器应当返回一个“404 Not Found”差错报文。
只支持http1.0和get方法
技术实现
网页访问流程
启动服务器,监听特定端口,接收客户端http请求,解析客户端http请求,根据url返回特定资源。
socket流程

首先自然是创建一个服务器套接字,使其能够接收客户端的请求
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#define PORT 8880
#define BUFFER_SIZE 5120
#define MAX_CLIENTS 100
#define FILE_SIZE 4096
int main(int argc, char *argv[]){
int server_sock, client_sock, *new_sock;
struct sockaddr_in server, client;
socklen_t client_len = sizeof(client);
server_sock = socket(AF_INET, SOCK_STREAM, 0);
if(server_sock == -1){
perror("Could not create socket");
return 1;
}
server.sin_family = AF_INET;
server.sinaddr.s_addr = INADDR_ANY;
server.sinport = htons(PORT);
if(bind(server_sock, (struct sockaddr *)&server, sizeof(server)) < 0){
perror("Bind failed");
return 1;
}
listen(server_sock, MAX_CLIENTS);
//...
}
AF.INET表示能够接收ipv4,INADDR_ANY表示接收任何地址的客户端连接,htons则将端口号转换成网络字节,然后用bind函数将服务器套接字和端口绑定起来,再调用listen,使系统开始监听服务器套接字的端口,等待客户端的连接。
接收客户端连接,解析http请求并返回资源
while (1) {
client_sock = accept(server_sock, (struct sockaddr *)&client, &client_len);
if (

最低0.47元/天 解锁文章
954

被折叠的 条评论
为什么被折叠?



