c++搭建http服务器

HTTP请求协议格式如下: 

HTTP响应协议格式如下: 

#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <string>#pragma comment(lib, "ws2_32.lib")//std::string generateResponse(const std::string& request) {
//    // 在此处根据实际需求生成相应的HTTP响应
//    std::string response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
//    response += "<html><body><h1>Hello, World!</h1></body></html>";
//    return response;
//}std::string generateResponse(const std::string& request) {// 在此处根据实际需求生成相应的HTTP响应std::string response = "HTTP/1.1 200 OK\r\n";response += "Content-Type: text/html\r\n";response += "Access-Control-Allow-Origin: *\r\n";//response += "Access-Control-Allow-Origin: http://localhost:8080\r\n"; // 允许http://localhost:8080的请求response += "Access-Control-Allow-Methods: GET, POST\r\n"; // 允许的请求方法response += "Access-Control-Allow-Headers: Content-Type\r\n"; // 允许的请求头response += "\r\n";response += "<html><body><h1>Hello, World!</h1></body></html>";return response;
}int main() {// 初始化WinsockWSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {std::cerr << "Failed to initialize Winsock." << std::endl;return -1;}// 创建监听套接字SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0);if (serverSocket == INVALID_SOCKET) {std::cerr << "Failed to create server socket." << std::endl;WSACleanup();return -1;}// 绑定地址和端口sockaddr_in serverAddress;serverAddress.sin_family = AF_INET;                   // IPv4serverAddress.sin_addr.s_addr = INADDR_ANY;           // 使用任意可用地址serverAddress.sin_port = htons(8080);                 // 监听端口8080if (bind(serverSocket, (sockaddr*)&serverAddress, sizeof(serverAddress)) == SOCKET_ERROR) {std::cerr << "Bind failed with error: " << WSAGetLastError() << std::endl;closesocket(serverSocket);WSACleanup();return -1;}// 开始监听if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) {std::cerr << "Listen failed with error: " << WSAGetLastError() << std::endl;closesocket(serverSocket);WSACleanup();return -1;}std::cout << "Server started. Waiting for connections..." << std::endl;while (true) {// 等待客户端连接sockaddr_in clientAddress;int clientAddressSize = sizeof(clientAddress);SOCKET clientSocket = accept(serverSocket, (sockaddr*)&clientAddress, &clientAddressSize);if (clientSocket == INVALID_SOCKET) {std::cerr << "Accept failed with error: " << WSAGetLastError() << std::endl;closesocket(serverSocket);WSACleanup();return -1;}std::cout << "Client connected." << std::endl;// 接收和发送数据const int bufferSize = 4096;char requestBuffer[bufferSize];memset(requestBuffer, 0, sizeof(requestBuffer));if (recv(clientSocket, requestBuffer, sizeof(requestBuffer), 0) == SOCKET_ERROR) {std::cerr << "Receive failed with error: " << WSAGetLastError() << std::endl;closesocket(clientSocket);closesocket(serverSocket);WSACleanup();return -1;}std::string request(requestBuffer);// 解析HTTP请求,获取请求路径等信息std::string requestPath;size_t firstSpace = request.find(' ');size_t secondSpace = request.find(' ', firstSpace + 1);if (firstSpace != std::string::npos && secondSpace != std::string::npos) {requestPath = request.substr(firstSpace + 1, secondSpace - firstSpace - 1);}std::cout << "Request: " << requestPath << std::endl;// 生成HTTP响应std::string response = generateResponse(requestPath);// 发送HTTP响应if (send(clientSocket, response.c_str(), response.size(), 0) == SOCKET_ERROR) {std::cerr << "Send failed with error: " << WSAGetLastError() << std::endl;closesocket(clientSocket);closesocket(serverSocket);WSACleanup();return -1;}// 关闭客户端连接std::cout << "Client disconnected." << std::endl;closesocket(clientSocket);}// 清理Winsockclosesocket(serverSocket);WSACleanup();return 0;
}
    test(){fetch("http://127.0.0.1:8080").then((response: Response) => {return response.text()}).then((value) => {console.log(value);console.log("dsfasd");})}

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

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

相关文章

企业级SQL开发:如何审核发布到生产环境的SQL性能

自从上世纪 70 年代数据库开始普及以来&#xff0c;DBA 们就不停地遭遇各种各样的数据库管理难题&#xff0c;其中最为显著的&#xff0c;可能就是日常的开发任务中&#xff0c;研发人员们对于核心库进行变更带来的一系列风险。由于针对数据库的数据变更是一项非常常见的任务&a…

C#-关于网络

操作IP地址、执行DNS查询。。。 使用套接字编程&#xff1b; 创建TCp和UDP客户端和服务器 使用HttpClient及其工厂&#xff1b;

python文件docx转pdf

centos部署的django项目&#xff0c;使用libreoffice做文件转换&#xff0c;官网给环境安装好libreoffice后&#xff0c;可使用命令行来进行转化 还可转换其他的各种格式&#xff0c;本文只做了pdf转换 import subprocess import os def convert_to_pdf(input_file, o…

Linux修改时区失败,手动修改localtime无效

有时候改了这个也不行&#xff0c;用命令行修改也不行 解决办法 &#xff1a;cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 或者想改其他时区的直接 ll /usr/share/zoneinfo/ 查看

DTCC2023大会-基于eBPF观测数据库-附所有PPT下载链接

DTCC2023大会-基于eBPF观测数据库-附所有PPT下载链接 8月16日—18日,第14届中国数据库技术大会(DTCC-2023)在北京国际会议中心举行。聚好看在大会上首次发布基于eBPF观测数据库性能的产品DBdoctor&#xff0c;受到了业界广泛的关注。近期几位业内同仁过来要大会的PPT&#xff…

python爬虫-某公开数据网站实例小记

注意&#xff01;&#xff01;&#xff01;&#xff01;某XX网站逆向实例仅作为学习案例&#xff0c;禁止其他个人以及团体做谋利用途&#xff01;&#xff01;&#xff01; 第一步&#xff1a;分析页面和请求方式 此网站没有技巧的加密&#xff0c;仅是需要携带cookie和请求…

Flask下载文件接口,以excl表哥为例

一、response 1、定义写入表哥的代码 def create_excel_xls(path, sheet_name, value):index len(value) # 获取需要写入数据的行数workbook xlwt.Workbook() # 新建一个工作簿sheet workbook.add_sheet(sheet_name) # 在工作簿中新建一个表格for i in range(0, inde…

使用Redis做数据缓存

目的 本关目的&#xff1a;使用Redis实现数据缓存。 相关知识 本文将将会你掌握&#xff1a;1&#xff0e;将数据加入缓存队列&#xff0c;2&#xff0e;缓存数据。 在我之前的文章中提到了实现了使用 Redis 做动态页面缓存&#xff0c;以此提高访问速度&#xff0c;但同时…

【AntDB 数据库】国产数据库发展之信创政策的加持

由于我国在信息技术领域起步较晚&#xff0c;国内大量的市场份额被国际IT巨头占据&#xff0c;甚至长期处于被垄断的地位&#xff0c;这也给了某些国家妄图通过挑起科技、贸易摩擦制衡我国发展的机会。为了解决可能存在的安全风险&#xff0c;在重要信息系统、关键基础设施中使…

什么牌子的开放式耳机好?开放式耳机选购指南来了!

在当今音频科技不断演进的时代&#xff0c;开放式耳机作为一种受欢迎的音频设备&#xff0c;吸引着越来越多的消费者&#xff0c;与封闭式耳机相比&#xff0c;开放式耳机在音质表现和舒适度上都具有独特的优势&#xff0c;在众多品牌和型号中选择一款满足个人需求的开放式耳机…

L1-022:奇偶分家

题目描述 给定N个正整数&#xff0c;请统计奇数和偶数各有多少个&#xff1f; 输入格式&#xff1a; 输入第一行给出一个正整N&#xff08;≤1000&#xff09;&#xff1b;第2行给出N个非负整数&#xff0c;以空格分隔。 输出格式&#xff1a; 在一行中先后输出奇数的个数、偶数…

劲松中西医结合医院回应:选择HPV医院标准及注意事项

随着目前我国HPV感染人群不断增多&#xff0c;其健康形势不容乐观&#xff0c;因此选择一家好的HPV医院对于恢复健康至关重要。HPV感染人群在选择HPV医院时&#xff0c;往往需要关注多个方面的因素。以下是一些具体建议&#xff0c;在难以抉择时可作为参考&#xff1a; 一、考…

C 语言格式化输出时间

本文部分内容借助于 AI 生成~ struct tm 是C语言标准库 <time.h> 中自带的结构体类型之一。它用于表示日历时间和日期时间的组成部分。 struct tm 结构体定义了以下成员变量&#xff1a; int tm_sec: 秒&#xff08;0-59&#xff09;int tm_min: 分钟&#xff08;0-59…

L1-024:后天

题目描述 如果今天是星期三&#xff0c;后天就是星期五&#xff1b;如果今天是星期六&#xff0c;后天就是星期一。我们用数字1到7对应星期一到星期日。给定某一天&#xff0c;请你输出那天的“后天”是星期几。 输入格式&#xff1a; 输入第一行给出一个正整数D&#xff08;1 …

LeetCode 13 罗马数字转整数

题目描述 罗马数字转整数 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M …

二.数据结构——数组

数组的定义 是一种由相同类型的元素组成的数据结构。它在内存中连续存储着一系列的元素&#xff0c;并且通过每个元素的索引来访问数组中的特定元素。数组的容量也就是长度会在一开始就被确定 优点 快速访问&#xff1a;由于数组的元素被存储在连续的内存位置中&#xff0c;因…

Linux 环境部署RabbitMQ

1.单机部署 我们在Centos7虚拟机中使用Docker来安装。 1.1.下载镜像 方式一&#xff1a;在线拉取 docker pull rabbitmq:3-management 方式二&#xff1a;从本地加载&#xff08;本文章带有mq安装包&#xff09; docker load -i mq.tar 1.2.安装MQ 执行下面的命令来运行…

CEN02 - Installing Python on Your Computer

文章目录 I. IntroductionII. Installing Python1. Download the latest version of Python from the official website2. Run the installer and follow the installation wizard3. Ensure that the "Add Python.exe to PATH" checkbox is checked for easier comma…

【华为OD题库-071】字符串筛选排序-java

题目 输入一个由n个大小写字母组成的字符串&#xff0c;按照Ascii码值从小到大的排序规则&#xff0c;查找字符串一中第k个最小ascii码值的字母(k> 1)&#xff0c;输出该字母所在字符串的位置索引(字符串的第一个字符位置索引为0)。 k如果大于字符串长度&#xff0c;则输出最…

阻碍“元宇宙”游戏行业发展的最大瓶颈是什么?

很显然&#xff0c;我们现在还没看到真正的“元宇宙”产品&#xff0c;在3-5年内也不太可能看到这样的产品。按照米哈游CEO蔡浩宇的说法&#xff0c;2030年希望建成一个“上亿人愿意生活在其中的虚拟世界”&#xff0c;那也是八年以后的事情了。 原因很简单&#xff1a;技术不成…