计算机网络实验:Linux下C语言实现Web服务器

总述

本项目实现了Linux系统下一个简易Web服务器要求:

  1. 当一个客户(浏览器)连接时,创建一个连接套接字;
  2. 从这个连接套接字接收 HTTP 请求;
  3. 解释该请求以确定所请求的特定文件;
  4. 从服务器的文件系统获得请求的文件;
  5. 创建一个由请求的文件组成的 HTTP 响应报文,报文前面有首部行;
  6. 经 TCP 连接向请求浏览器发送响应;
  7. 如果浏览器请求一个在该服务器中不存在的文件,服务器应当返回一个“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 (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值