首页 > 编程语言 >C++代码实现一个简易http服务端,返回给客户端一张图片

C++代码实现一个简易http服务端,返回给客户端一张图片

时间:2024-06-03 21:44:05浏览次数:28  
标签:http int pictureBuffer C++ ret serverAddr perror sfd 服务端

注意事项

  • sprintf读取字符串时,遇到\0会结束,所以不能用sprintf来读取* pictureBuffer
  • void *memcpy(void *str1, const void *str2, size_t n),str2会覆盖str1里的内容

代码

#include <func.h>

char pictureBuffer[150 * 1024];
char buffer[200 * 1024];


int main()
{
    int sfd = socket(AF_INET,SOCK_STREAM,0);
    if(sfd == -1){
        perror("socket");
    }

    int fd = open("./dog.jpg",O_RDONLY);
    if(fd == -1){
        perror("open");
    }
    struct stat st;
    if (fstat(fd, &st) == -1) {
        perror("fstat");
        close(fd);
        close(sfd);
        exit(EXIT_FAILURE);
    }
    size_t fileSize = st.st_size;

    memset(pictureBuffer,0,sizeof(pictureBuffer));
    int ret = read(fd,pictureBuffer,fileSize);

    struct sockaddr_in serverAddr;
    serverAddr.sin_addr.s_addr = inet_addr("192.168.44.128");
    serverAddr.sin_port = htons(8081);
    serverAddr.sin_family = AF_INET;

    int on = 1;
    ret = setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

    ret = bind(sfd,(struct sockaddr*)&serverAddr,sizeof(serverAddr));
    if(ret == -1){
        perror("bind");
    }

    ret = listen(sfd,10);
    if(ret == -1){
        perror("listen");
    }

    while(1){

        struct sockaddr_in clientAddr;
        memset(&clientAddr,0,sizeof(clientAddr));
        socklen_t len = sizeof(clientAddr);
        int clientfd = accept(sfd,(struct sockaddr*)&clientAddr,&len);
        if(clientfd == -1){
            perror("accept");
        }

        const char* startLine = "HTTP/1.1 200 OK\r\n";
        const char* headers = "Server: HiaServer\r\n"
            "Content-Type: image/jpeg\r\n"
            "Content-Length: ";
        const char* emptyLine = "\r\n";

        sprintf(buffer,"%s%s%ld\r\n%s",
                startLine,headers,fileSize,emptyLine);
        
        ret = send(clientfd,buffer,strlen(buffer),0);

        send(clientfd,pictureBuffer,fileSize,0);
        printf("\nsend %ld bytes\n",fileSize + strlen(buffer));
        close(clientfd);

    }
    close(fd);
    close(sfd);

    return 0;
}

标签:http,int,pictureBuffer,C++,ret,serverAddr,perror,sfd,服务端
From: https://www.cnblogs.com/EavenWang/p/18229729

相关文章

  • C++ tracy性能分析
    #defineTRACY_FIBERS#include"tracy/Tracy.hpp"#include"tracy/TracyC.h"constchar*fiber="job1";TracyCZoneCtxzone;inttest(){std::threadt1([]{TracyFiberEnter(fiber);TracyCZone(ctx,1);......
  • TensorRT c++部署onnx模型
    在了解一些概念之前一直看不懂上交22年开源的TRTModule.cpp和.hpp,好在交爷写的足够模块化,可以配好环境开箱即用,移植很简单。最近稍微了解了神经网络的一些概念,又看了TensorRT的一些api,遂试着部署一下自己在MNIST手写数字数据集上训练的一个LeNet模型,识别率大概有98.9%,实现用pytor......
  • C++命名空间(详解)
    C++基础语法C++基于C语言的改进:c++在C语言的基础上引入并扩充了面向对象的概念C++基础概念:C++是基于C语言而产生的,它即可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计在1998年出现C++98C++成熟他是标......
  • C/C++多文件目录编译
    本人的项目目录如下:-helloworld -header helloworld.h -src helloworld.cpp main.cpp -bin a.exe在编译g++src/main.cppsrc/helloworld.cpp-obin/a.exe时控制台error:fatalerror:header/helloworld.h:Nosuchfileordirectory,源文件是这样#include"he......
  • Spring Boot入坑-7-后端HTTP请求
    概述后端项目完成后,除了前后端分离模式的前端对后端请求的需要,如Vue通过Axios.js组件请求后端REST接口;不同后端系统中也需要进行相互的HTTP请求,实现各业务系统的业务交互;如订单服务,会调用支付服务、库存服务、积分服务等,如下图​后端HTTP请求图​JDK的java.net包中已经......
  • c++——vector
    c++——vectorvector的介绍vector的简介迭代器的作用vector的迭代器失效问题可能导致vector迭代器失效的操作vector的模拟实现完整代码vector.hTest.h代码测试结果vector的介绍vector的文档介绍vector的简介vector是表示可变大小数组的序列容器。vector采用的连......
  • [C++] 小游戏 斗破苍穹 2.2.1至2.11.5所有版本(下) zty出品
    2.10.6#include<stdio.h>#include<iostream>#include<ctime>#include<bits/stdc++.h>#include<time.h>#include<windows.h>//SLEEP函数usingnamespacestd;intboss1=0,boss2=0;structPlayer{//玩家结构体,并初始化playercharname[21......
  • 编程奇境:C++之旅,从新手村到ACM/OI算法竞赛大门(武器:排序算法)
    引言现在你已经拥有了c++的基础语法知识,人物已经有了基本属性,那么想要打怪,手里必须要有趁手的武器,各种算法就是手中的武器,要根据怪物的不同特性来选择不同的武器。本章节讲的就是新手第一把武器:排序算法。所谓排序算法就是把一些乱序的序列按照从小到大或从大到小进行排序,是......
  • C++:priority_queue的模拟实现 | 仿函数
    ✨✨✨学习的道路很枯燥,希望我们能并肩走下来!文章目录文章目录前言一priority_queue的介绍二priority_queue的使用三 priority_queue的初步模拟实现四仿函数  4.1什么是仿函数4.2常见仿函数 ​编辑 4.3常见仿函数的模拟实现4.3.1less 4.3.2 gre......
  • c++在Linux下把gbk编码转为utf8编码类型
    #include<iostream>#include<string.h>#include<iconv.h>#include<memory>std::stringgbk_to_utf8(conststd::string&gbk_str){size_tin_len=gbk_str.size();size_tout_len=in_len*4;//设置足够大,确保可以存放转换后的UTF-8字符串std::uni......