0

0

C++简单HTTP服务器 socket网络编程入门

P粉602998670

P粉602998670

发布时间:2025-08-23 11:41:01

|

539人浏览过

|

来源于php中文网

原创

答案:用C++通过socket实现HTTP服务器需创建socket、绑定端口、监听连接、接收请求并发送响应。首先调用socket()创建TCP套接字,设置地址复用后绑定到指定IP和端口(如8080),再调用listen()进入监听状态。通过accept()接受客户端连接,recv()读取HTTP请求并解析路径,最后构造符合协议的响应(含状态行、头部、正文),使用send()发送后关闭连接。示例代码展示了完整流程,编译运行后浏览器访问localhost:8080可看到“Hello World”,核心在于掌握套接字编程流程与HTTP协议格式。

c++简单http服务器 socket网络编程入门

想用C++写一个简单的HTTP服务器来理解网络编程?从零开始用socket实现一个能响应基本请求的服务器,是学习网络通信的好方法。下面带你一步步实现一个最基础的HTTP服务器,帮助你掌握C++中socket编程的核心流程。

创建Socket并绑定端口

在Linux环境下,使用socket()函数创建一个网络通信端点。我们使用IPv4(AF_INET)和TCP协议(SOCK_STREAM)。

创建后,需要将socket绑定到指定IP和端口上,通常本地测试使用127.0.0.10.0.0.0监听所有接口,端口比如8080

关键步骤:

立即学习C++免费学习笔记(深入)”;

  • 调用socket(AF_INET, SOCK_STREAM, 0)创建socket
  • 设置地址复用(可选,避免端口占用问题)
  • 填充sockaddr_in结构体,指定IP和端口
  • 调用bind()绑定

监听连接并接受客户端请求

绑定成功后,调用listen()让socket进入监听状态,等待客户端连接。

使用accept()接受来自客户端的连接,它会阻塞等待,直到有客户端发起TCP三次握手。accept返回一个新的socket文件描述符,专门用于与该客户端通信。

示例流程:

  • listen(sockfd, 5):最多允许5个连接排队
  • accept(sockfd, &client_addr, &addr_len):获取客户端地址信息

接收并解析HTTP请求

客户端(如浏览器)通过TCP连接发送HTTP请求,格式类似:

智能网站优化SiteSEO1.52
智能网站优化SiteSEO1.52

系统易学易懂,用户只需会上网、不需学习编程及任何语言,只要使用该系统平台,只要会打字,即可在线直接完成建站所有工作。本程序适合不懂php环境配置的新手用来在本机调试智能SiteSEO网站优化软件,安装过程极其简单。您的网站地址:http://localhost您的网站后台:登录地址: http://localhost/admin.php密 码: admin服务器套件所包含的软件:nginx-0.7

下载
GET / HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0
...

recv()函数读取客户端发来的数据。虽然HTTP协议基于文本,但接收的是原始字节流,需手动解析请求行和头部。

简单服务器可以只关注请求行中的路径(如/)来决定返回内容。

发送HTTP响应

服务器处理完请求后,需要按HTTP协议格式返回响应。一个最简单的响应如下:

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 13

Hello World

使用send()函数将响应头和正文发送回客户端。注意Content-Length必须准确,否则浏览器可能无法正确显示内容。

发送完成后,可以关闭客户端socket,服务器继续监听下一个连接。

完整示例代码片段(Linux环境)

以下是简化版核心逻辑:

#include 
#include 
#include 
#include 
#include 

int main() {
    int server_fd, client_fd;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);

    // 创建socket
    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

    // 绑定
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);
    bind(server_fd, (struct sockaddr *)&address, sizeof(address));

    // 监听
    listen(server_fd, 5);
    std::cout << "Server running on port 8080...\n";

    while(true) {
        // 接受连接
        client_fd = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen);

        char buffer[1024] = {0};
        recv(client_fd, buffer, 1024, 0);
        std::cout << "Request:\n" << buffer;  // 打印请求

        // 发送响应
        const char *response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: 13\r\n\r\nHello World";
        send(client_fd, response, strlen(response), 0);
        close(client_fd);
    }

    return 0;
}

编译:g++ server.cpp -o server,运行后在浏览器访问http://localhost:8080即可看到"Hello World"。

基本上就这些。这个例子虽然简单,但涵盖了socket编程的主要环节:创建、绑定、监听、接受、收发数据。后续可以扩展支持静态文件、多线程处理并发等。不复杂但容易忽略细节,比如换行符要用\r\n,Content-Length要算准。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

197

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

189

2025.07.04

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1027

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

66

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

455

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

11

2026.01.19

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

922

2023.09.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

482

2023.08.10

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.2万人学习

C 教程
C 教程

共75课时 | 4.1万人学习

C++教程
C++教程

共115课时 | 13.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号