我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Linux下搭建HTTP服务器完成图片显示功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Linux下搭建HTTP服务器完成图片显示功能

目录
  • 1. 前言
  • 2. HTTP协议介绍
  • 3. HTTP的消息结构
  • 4. HTTP交互流程
  • 5. 案例代码: 搭建HTTP服务器
  • 6. 最终运行的效果

1. 前言

作为linux下socket(TCP)网络编程的练习,使用C语言代码搭建一个简单的HTTP服务器,完成与浏览器之间的交互,最终在浏览器上显示一张图片。

2. HTTP协议介绍

HTTP协议本身是基于TCP通信协议来传递数据(HTML 文件, 图片文件-也叫超文本传输协议),HTTP协议必须工作在客户端-服务端架构上(本身底层就是TCP),HTTP 默认端口号为 80(浏览器访问默认就是80端口),但是你也可以改为 8080 或者其他端口(可以手动指定端口)。

HTTP协议是无连接的,也就是限制每次连接只处理一个请求;服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

3. HTTP的消息结构

客户端向HTTP服务器发送的请求消息格式包括了4个部分:
请求行(request line)、 请求头部(header)、空行、请求数据

Linux下搭建HTTP服务器完成图片显示功能

下面这个是浏览器的请求,可以对比上面这张图的格式:

GET / HTTP/1.1
Host: 10.0.0.6
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*
int HTTP_ServerSendFile(int client_fd,char *buff,char *type,char *file)
{
    
    int fd=open(file,2);
    if(fd<0)return -1;
    
    struct stat s_buff;
    fstat(fd,&s_buff);
    
    sprintf(buff,"HTTP/1.1 200 OK\r\n"
                "Content-type:%s\r\n"
                "Content-Length:%d\r\n"
                "\r\n",type,s_buff.st_size);
    
    if(write(client_fd,buff,strlen(buff))!=strlen(buff))return -2;
    
    int cnt;
    while(1)
    {
        cnt=read(fd,buff,1024);
        if(write(client_fd,buff,cnt)!=cnt)return -3;
        if(cnt!=1024)break;
    }
    return 0;
}


void *thread_work_func(void *argv)
{
    int client_fd=*(int*)argv;
    free(argv);

    unsigned int cnt;
    unsigned char buff[1024];
    //读取浏览器发送过来的数据
    cnt=read(client_fd,buff,1024);
    buff[cnt]='\0';
    printf("%s\n",buff);

    if(strstr(buff,"GET / HTTP/1.1"))
    {
        HTTP_ServerSendFile(client_fd,buff,"text/html","www/image_text.html");
    }
    else if(strstr(buff,"GET /www/123.jpg HTTP/1.1"))
    {
        HTTP_ServerSendFile(client_fd,buff,"image/jpeg","www/888.jpg");
    }
    else if(strstr(buff,"GET /favicon.ico HTTP/1.1"))
    {
        HTTP_ServerSendFile(client_fd,buff,"image/x-icon","www/1.ico");
    }
    
    close(client_fd);
    //退出线程
    pthread_exit(NULL);
}

int main(int argc,char **argv)
{   
    if(argc!=2)
    {
        printf("./app <端口号>\n");
        return 0;
    }

    signal(SIGPIPE,SIG_IGN); //忽略 SIGPIPE 信号--防止服务器异常退出

    int sockfd;
    
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    int on = 1;
    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

    
    struct sockaddr_in addr;
    addr.sin_family=AF_INET;
    addr.sin_port=htons(atoi(argv[1])); // 端口号0~65535
    addr.sin_addr.s_addr=INADDR_ANY;    //inet_addr("0.0.0.0"); //IP地址
    if(bind(sockfd,(const struct sockaddr *)&addr,sizeof(struct sockaddr))!=0)
    {
        printf("服务器:端口号绑定失败.\n");
    }
    
    listen(sockfd,20);

    
    int *client_fd;
    struct sockaddr_in client_addr;
    socklen_t addrlen;
    pthread_t thread_id;
    while(1)
    {
        addrlen=sizeof(struct sockaddr_in);
        client_fd=malloc(sizeof(int));
        *client_fd=accept(sockfd,(struct sockaddr *)&client_addr,&addrlen);
        if(*client_fd<0)
        {
            printf("客户端连接失败.\n");
            return 0;
        }
        printf("连接的客户端IP地址:%s\n",inet_ntoa(client_addr.sin_addr));
        printf("连接的客户端端口号:%d\n",ntohs(client_addr.sin_port));

        
        if(pthread_create(&thread_id,NULL,thread_work_func,client_fd))
        {
            printf("线程创建失败.\n");
            break;
        }
        
        pthread_detach(thread_id);
    } 
    
    close(sockfd);
    return 0;
}

6. 最终运行的效果

Linux下搭建HTTP服务器完成图片显示功能

到此这篇关于Linux下搭建简易的HTTP服务器完成图片显示的文章就介绍到这了,更多相关linux搭建http服务器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Linux下搭建HTTP服务器完成图片显示功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Linux下搭建HTTP服务器完成图片显示功能

目录1. 前言2. HTTP协议介绍3. HTTP的消息结构4. HTTP交互流程5. 案例代码: 搭建HTTP服务器6. 最终运行的效果1. 前言 作为linux下socket(TCP)网络编程的练习,使用C语言代码搭建一个简单的HTTP
2022-06-05

linux下FastDFS搭建图片服务器

目录服务器规划一、安装系统组件二、安装fastdfs三、配置图片服务器文件总结服务器规划服务器名称IP地址和端口备注 fastdfs-tracker*:22122跟踪服务器/调度服务器fastdfs-storage*:23000
2022-06-04

linux下FastDFS如何搭建图片服务器

这篇文章给大家分享的是有关linux下FastDFS如何搭建图片服务器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。服务器规划服务器名称IP地址和端口备注fastdfs-tracker*:22122跟踪服务器/调
2023-06-22

Windows下使用 Nginx 搭建 HTTP文件服务器 实现文件下载功能

Nginx 是一款轻量级的 HTTP 服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的 IO 性能,时常用于服务端的反向代理和负载均衡,这篇文章主要介绍了Windows下使用 Nginx 搭建 HTTP文件服务器实现文件下载功能,需要的朋友可以参考下
2023-03-07

Windows下怎么使用Nginx搭建HTTP文件服务器实现文件下载功能

本文小编为大家详细介绍“Windows下怎么使用Nginx搭建HTTP文件服务器实现文件下载功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“Windows下怎么使用Nginx搭建HTTP文件服务器实现文件下载功能”文章能帮助大家解决疑惑
2023-07-05

编程热搜

目录