Linux实现一个简单的HTTP服务器

本文介绍了一个简易HTTP服务器的实现过程,包括使用socket编程建立服务器、监听客户端请求并响应等关键技术点。该服务器能够处理HTTP请求,并返回简单的欢迎页面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码实现 :


Makefile :
.PHONY:all clean
all:http_server
http_server:http_server.c                                                                                                                                         
        gcc $^ -o $@ -lpthread
clean:
        rm -rf http_server
http_server.c :
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <pthread.h>
#include <stdlib.h>                                                                                                                                               

int startup()
{
    int sock = socket(AF_INET,SOCK_STREAM,0);
    if(sock < 0)
    {   
        exit(1);//退出进程
    }   

    int opt = 1;
    setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

    struct sockaddr_in local;
    local.sin_family = AF_INET;
    local.sin_addr.s_addr = htonl(INADDR_ANY);
    local.sin_port = htons(8080); // 指定固定端口

    int ret = bind(sock,(struct sockaddr *)&local,sizeof(local));
    if( ret < 0 ) 
    {   
        exit(2);
    }   

    if( listen(sock,5) < 0 ) 
    {   
        exit(3);
    }   
        return sock;
}

void* handler_request(void * arg)
{
    int sock = (int)arg;
    char buf[4896];
    ssize_t s = read(sock,buf,sizeof(buf)-1);
    if( s > 0 )
    {
        buf[s] = 0;
        printf(" %s ",buf);
        const char *echo_str = "HTTP/1.0 200 ok\n\n<html><h1>Welcome to my http server!</h1><html>\n";
        write(sock,echo_str,strlen(echo_str));
    }
    close(sock);
}

int main()
{
    int listen_sock = startup();
    while(1)
    {
        struct sockaddr_in client;
        socklen_t len = sizeof(client);
        int sock = accept(listen_sock,(struct sockaddr*)&client,&len);
        if(sock < 0)
        {
            continue;
        }
        pthread_t tid;
        pthread_create(&tid,NULL,handler_request,(void *)sock);
               pthread_detach(tid);
    }
    return 0; 
}

测试:


必须在一个局域网(网段)中,才能访问到,也就是客户端和服务器端连接一个路由器。

服务器端:

这里写图片描述

客户端:

手机:
这里写图片描述

电脑:

这里写图片描述


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值