http网络服务器

wwwroot(目录)/index.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>比特就业课</title>
</head><body><h3>这是一个Linux课程</h3><p>我是一个Linux的学习者,我正在进行http的测试工作!!!</p>
</body></html>

Makefile

HttpServer:HttpServer.ccg++ -o HttpServer HttpServer.cc -std=c++11.PHONY:clean
clean:rm -f HttpServer

Log.hpp

#pragma once
#include <iostream>
#include <string>
#include <cstdarg>
#include <cstdio>
#include <ctime>#define DEBUG 0
#define NORMAL 1
#define WARNING 2
#define ERROR 3
#define FATAL 4const char *gLevelMap[5] = {"DEBUG", "NORMAL", "WARNING", "ERROR", "FATAL"};#define LOGFILE "./threadpool.log"void logMessage(int level, const char *format, ...)
{char stdBuffer[1024]; // 标准部分time_t timestamp = time(nullptr);struct tm *time = localtime(&timestamp);snprintf(stdBuffer, sizeof stdBuffer, "[%s][%ld]", gLevelMap[level], timestamp);char logBuffer[1024]; // 自定义部分va_list args;va_start(args, format);vsnprintf(logBuffer, sizeof(logBuffer), format, args); // 使用 vsnprintf 而不是 vsprintfva_end(args);//FILE* fp=fopen(LOGFILE,"a");//打印到显示器printf("%s %s\n", stdBuffer, logBuffer);// 打印到指定文件//fprintf(fp,"%s%s\n",stdBuffer,logBuffer);//fclose(fp);
}

Sock.hpp

#pragma once#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string>
#include <sys/wait.h>#include "Log.hpp"
#include <memory>class Sock
{
private:const static int gbacklog = 20;public:Sock() {}int Socket(){int listensock = socket(AF_INET, SOCK_STREAM, 0);if (listensock < 0){logMessage(FATAL, "create socket error,%d:%s", errno, strerror(errno));exit(2);}logMessage(NORMAL, "create socket success, listensock: %d", listensock);return listensock;}void Bind(int sock, uint16_t port, std::string ip = "0.0.0.0"){struct sockaddr_in local;memset(&local, 0, sizeof(local));local.sin_family = AF_INET;local.sin_port = htons(port);inet_pton(AF_INET, ip.c_str(), &local.sin_addr);// local.sin_addr.s_addr = _ip.empty() ? INADDR_ANY : inet_addr(_ip.c_str());if (bind(sock, (const sockaddr *)&local, sizeof(local)) < 0){logMessage(FATAL, "bind error, %d:%s", errno, strerror(errno));exit(3);}}void Listen(int sock){if (listen(sock, gbacklog) < 0){logMessage(FATAL, "listen error, %d:%s", errno, strerror(errno));exit(4);}logMessage(NORMAL, "listen server success");}int Accept(int listensock, std::string *ip, uint16_t *port){struct sockaddr_in src;memset(&src, 0, sizeof(src));socklen_t len = sizeof(src);int servicesock = accept(listensock, (struct sockaddr *)&src, &len);if (servicesock < 0){logMessage(ERROR, "accept error,%d:%s", errno, strerror(errno));return -1;}if (port)*port = ntohs(src.sin_port);if (ip)*ip = inet_ntoa(src.sin_addr);return servicesock;}bool Connect(int sock, const std::string &server_ip, const uint16_t &server_port){struct sockaddr_in server;memset(&server, 0, sizeof(server));server.sin_family = AF_INET;server.sin_port = htons(server_port);server.sin_addr.s_addr = inet_addr(server_ip.c_str());if (connect(sock, (struct sockaddr *)&server, sizeof(server)) == 0)return true;elsereturn false;}~Sock(){}
};

Usage.hpp

#pragma once
#include <iostream>void Usage(const char *args)
{std::cout << "\nUsage: " << args << " port" << std::endl;
}

Util.hpp

#pragma once#include <iostream>
#include <vector>class Util
{
public:static void cutString(const std::string &s, const std::string &sep, std::vector<std::string> *out){std::size_t start = 0;while (start < s.size()){auto pos = s.find(sep, start);if (pos == std::string::npos){break;}std::string sub = s.substr(start, pos - start);out->push_back(sub);start += sub.size();start += sep.size();}if (start < s.size())out->push_back(s.substr(start));}
};

HttpServer.hpp

#pragma once#include <iostream>
#include "Sock.hpp"
#include <functional>
#include <unistd.h>class HttpServer
{
public:using func_t = std::function<void(int)>;public:HttpServer(uint16_t port, func_t func): _port(port), _func(func){_listensock = sock.Socket();sock.Bind(_listensock, _port);sock.Listen(_listensock);}void Start(){signal(SIGCHLD, SIG_IGN);while (true){std::string clientIp;uint16_t clientPort;int sockfd = sock.Accept(_listensock, &clientIp, &clientPort);if (sockfd == -1){continue;}if (fork() == 0){close(_listensock);_func(sockfd);close(sockfd);exit(0);}close(sockfd);}}~HttpServer(){if (_listensock >= 0){close(_listensock);}}private:int _listensock;uint16_t _port;Sock sock;func_t _func;
};

HttpServer.cc

#include <iostream>
#include "HttpServer.hpp"
#include <memory>
#include "Usage.hpp"
#include <unistd.h>
#include "Util.hpp"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <fstream>#define ROOT "./wwwroot"
#define HOMEPAGE "index.html"void HandlerHttpRequest(int sockfd)
{// 1.读取请求char buffer[1024];int s = read(sockfd, buffer, sizeof buffer);if (s > 0){buffer[s] = 0;// std::cout << buffer << "--------------------" << std::endl;}std::vector<std::string> vline;Util::cutString(buffer, "\n", &vline);std::vector<std::string> vblock;Util::cutString(vline[0], " ", &vblock);std::string file = vblock[1];std::string target = ROOT;//默认首页if (file == "/")file = "/index.html";target += file;std::cout << target << std::endl;std::string content;std::ifstream in(target);if (in.is_open()){std::string line;while (std::getline(in, line)){content += line;}in.close();}// for (auto &iter : vblock)// {//     std::cout << iter << "\n"//               << std::endl;// }// 2.试着构建一个http的响应std::string HttpResponse;if (content.empty()){HttpResponse = "HTTP/1.1 404 NotFound\r\n";}elseHttpResponse = "HTTP/1.1 200 OK\r\n";HttpResponse += "\r\n";HttpResponse += content;send(sockfd, HttpResponse.c_str(), HttpResponse.size(), 0);
}int main(int argc, char *argv[])
{if (argc != 2){Usage(argv[0]);exit(0);}std::unique_ptr<HttpServer> httpserver(new HttpServer(atoi(argv[1]), HandlerHttpRequest));httpserver->Start();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/26004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零到发布:npm插件包终极指南

在JavaScript和Node.js的生态系统中&#xff0c;npm&#xff08;Node Package Manager&#xff09;是最重要的包管理工具之一。通过npm&#xff0c;开发者可以共享代码、复用他人的工作成果以及协作开发。本指南将详细介绍如何通过npm发布自己的插件包&#xff0c;以便其他开发…

平安养老险陕西分公司荣获“2021-2023年乡村振兴‘三村工程’先进机构”

5月27日&#xff0c;中国平安成立36周年司庆暨三省推广启动大会顺利召开。会上&#xff0c;平安养老险陕西分公司获“2021-2023年乡村振兴‘三村工程’先进机构”荣誉表彰。 过去三年间&#xff0c;平安养老险陕西分公司始终坚持金融为民&#xff0c;在平安集团、平安养老险的指…

注解 - @CookieValue

注解简介 在今天的每日一注解中&#xff0c;我们将探讨CookieValue注解。CookieValue是Spring框架中的一个注解&#xff0c;用于将HTTP请求中的Cookie值绑定到控制器方法的参数上。 注解定义 CookieValue注解用于从HTTP请求中的Cookie提取值&#xff0c;并将其绑定到控制器方…

Linux系统sort排序与uniq去重

Linux系统sort排序与uniq去重 工作中数据太多太杂&#xff0c;不便于查看分析。这时是可以采用sort将数据排序&#xff0c;同时可以配合uniq命令进行去重。 场景&#xff1a;云平台中&#xff0c;日常工作包含巡检工作&#xff0c;是通过事先编写好的巡检脚本去检测云平台的和…

阿赵UE引擎C++编程学习笔记——查找和控制Actor

大家好&#xff0c;我是阿赵。   在使用Unity引擎的时候&#xff0c;经常会用到的一个功能是通过GameObject.Find去查找场景里面的对象。这次变成在UE引擎里面做同样的事情&#xff0c;这篇文章主要做的事情有2个&#xff0c;第一是从场景里面找到特定的Actor&#xff0c;第二…

MFC上下文菜单与定时器学习笔记

本博文简单介绍了上下文菜单以及定时器的知识内容&#xff0c;作为笔记发表在csdn上面。 在这里插入图片描述 菜单资源的使用 添加菜单资源加载菜单资源&#xff1a; 注册窗口类时设置菜单创建窗口传参设置菜单在主窗口WM_CREATE消息中利用SetMenu函数设置 加载菜单资…

Python编写和管理装饰器库之wrapt使用详解

概要 在 Python 编程中,装饰器(decorator)是一个非常强大的工具,可以在不修改原函数代码的情况下,增强函数的功能。然而,编写装饰器有时会遇到一些复杂的问题,比如保持被装饰函数的元信息、正确传递参数等。wrapt 库提供了一组工具,帮助开发者更容易地编写和管理装饰器…

深圳比创达电子|EMI电磁干扰行业:挑战到突破,电子产业新未来

随着电子技术的飞速发展&#xff0c;电磁干扰&#xff08;EMI&#xff09;问题日益凸显&#xff0c;成为影响电子设备性能和稳定性的重要因素。EMI电磁干扰行业作为解决这一问题的关键领域&#xff0c;正面临着前所未有的机遇与挑战。 一、引言&#xff1a;EMI电磁干扰行业的崛…

分布式事务AP控制方案(下)

分布式事务控制方案 本篇文章给出一种要求高可用性&#xff08;AP思想&#xff09;的分布式事务控制方案 上篇回顾&#xff1a;点我查看 分布式事务控制方案1、前景回顾2、数据库和缓存的操作3、分布式文件系统1&#xff09;页面静态化2&#xff09;远程调用3&#xff09;调用…

语法、语义、语用与向量化

一、字符、向量和语义 在计算机科学和自然语言处理中&#xff0c;字符、向量和语义是三个重要的概念&#xff0c;它们之间存在着密切的关系。 字符是构成文本的基本单位&#xff0c;例如字母、数字、标点符号等。在计算机中&#xff0c;字符通常用二进制编码表示&#xff0c;例…

10秒钟docker 安装Acunetix

1、拉取镜像&#xff1a; 2、查看镜像&#xff1a; [rootdns-server ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE quay.io/hiepnv/acunetix latest f8415551b8f4 2 months ago 1.98GB 3、运行镜像&#xff1a; …

优思学院|用ChatGPT快速完成数据分析图表【柏累托图法】

数据分析是很多行业的人不可少的一部分&#xff0c;尤其是质量工程师更是日常的工作。然而&#xff0c;随着科技的进步&#xff0c;人工智能&#xff08;AI&#xff09;将逐渐承担起数据计算的工作&#xff0c;这意味着未来的质量工程师需要具备的不仅仅是计算能力&#xff0c;…

徐州服务器租用:大带宽的重要性

当企业用户选择服务器租用的同时&#xff0c;还需要为服务器选择带宽、内存等硬件设备&#xff0c;大多数的企业在进行服务器租用时会选择大带宽&#xff0c;用户选择大带宽的原因有哪些呢&#xff1f; 在单位时间内可以在线路上传送的数据量被称为带宽&#xff0c;带宽越大&am…

WEB前端几点上下班:深入探索工作时间安排的奥秘与挑战

WEB前端几点上下班&#xff1a;深入探索工作时间安排的奥秘与挑战 在数字化时代的浪潮下&#xff0c;WEB前端作为连接用户与数字世界的桥梁&#xff0c;扮演着至关重要的角色。然而&#xff0c;关于WEB前端工程师的上下班时间&#xff0c;却常常引发人们的困惑与好奇。今天&am…

c,c++,go语言字符串的演进

#include <stdio.h> #include <string.h> int main() {char str[] {a,b,c,\0,d,d,d};printf("string:[%s], len:%d \n", str, strlen(str) );return 0; } string:[abc], len:3 c语言只有数组的概念&#xff0c;数组本身没有长度的概念&#xff0c;需…

ISO 19115-3:2023 基本概念的 XML模式实现

前言 ISO(国际标准化组织)是由各国标准化机构(ISO 成员机构)组成的全球性联合会。制定国际标准的工作通常由 ISO 技术委员会完成。对某一技术委员会所关注的主题感兴趣的每个成员机构都有权在该委员会中派代表。与 ISO 联络的国际组织、政府和非政府组织也参与工作。ISO 与…

运营商大模型进化之路:策略分野与AI未来的璀璨展望

运营商大模型的进化路线“分野”与AI大模型的璀璨前景 随着人工智能技术的飞速发展&#xff0c;AI大模型已成为推动科技进步和产业变革的重要力量。在这个浪潮中&#xff0c;运营商作为通信行业的巨头&#xff0c;也纷纷投入大模型的研发与应用&#xff0c;探索出各自独特的进化…

Mid-journey Prompts -core

以“-core”结尾的描述符。这些提示往往会产生强烈的影响&#xff0c;因为它们涵盖了整个风格、动作和美学。 提示词&#xff1a;Dreamcore [主题] Dreamcore 通过尝试使用鲜艳的色彩、奇怪的形状和不合时宜的物体来捕捉做梦的感觉&#xff0c;从而探索超现实。Midjourney 还喜…

性能测试2【搬代码】

1.性能测试脚本完善以及增强 2.jmeter插件安装以及监控使用 3.性能压测场景设置&#xff08;基准、负载、压力、稳定性&#xff09; 4. 无界面压测场景详解 一、性能测试脚本完善以及增强 使用控制器的目的是使我们的脚本更加接近真实的场景 1.逻辑控制器: 【事务控制器】&…

MySQL存储引擎详述:InnoDB为何胜出?

MySQL作为当前最流行的开源关系型数据库之一,其强大的功能和良好的性能使其广泛应用于各种规模的应用系统中。其中,存储引擎的设计理念是MySQL数据库灵活高效的关键所在。 一、什么是存储引擎 存储引擎是MySQL架构的重要组成部分,负责MySQL中数据的存储和提供了视图,存储过程等…