c++搭建http服务器

 使用 QtWebApp 编写 Web 服务器应用程序 (stefanfrings.de)

HTTP请求协议格式如下: 

请求行:[请求方法] + [URI] + [HTTP版本]。
请求报头:请求的属性,这些属性都是以key: value的形式按行陈列的。Content-Length
空行:遇到空行表示请求报头结束。
请求正文:请求正文允许为空字符串,如果请求正文存在,则在请求报头中会有一个Content-Length属性来标识请求正文的长度。

HTTP响应协议格式如下: 

状态行:[HTTP版本] + [状态码] + [状态码描述]。
响应报头:响应的属性,这些属性都是以key: value的形式按行陈列的。
空行:遇到空行表示响应报头结束。
响应正文:响应正文允许为空字符串,如果响应正文存在,则在响应报头中会有一个Content-Length属性来标识响应正文的长度。

#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() {
    // 初始化Winsock
    WSADATA 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;                   // IPv4
    serverAddress.sin_addr.s_addr = INADDR_ANY;           // 使用任意可用地址
    serverAddress.sin_port = htons(8080);                 // 监听端口8080

    if (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);
    }

    // 清理Winsock
    closesocket(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");
        })
    }
#include <iostream>
#include <QTcpServer>
#include <QTcpSocket>
#include <QByteArray>
#include <QString>
#include <QCoreApplication>
#include <QDebug>
QString generateResponse(const QString& request) {
    // 在此处根据实际需求生成相应的HTTP响应
    QString 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-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(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    // 创建监听套接字
    QTcpServer server;
    if (!server.listen(QHostAddress::Any, 8080)) {
        qDebug() << "Failed to start server." ;
        return -1;
    }

    qDebug() << "Server started. Waiting for connections...";

    QObject::connect(&server, &QTcpServer::newConnection, [&]() {
        while (server.hasPendingConnections()) {
            QTcpSocket* clientSocket = server.nextPendingConnection();
            qDebug() << "Client connected." ;

            QObject::connect(clientSocket, &QTcpSocket::readyRead, [=]() {
                QByteArray requestData = clientSocket->readAll();
                QString request(requestData);

                // 解析HTTP请求,获取请求路径等信息
                QString requestPath;

                int firstSpace = request.indexOf(' ');
                int secondSpace = request.indexOf(' ', firstSpace + 1);

                if (firstSpace != -1 && secondSpace != -1) {
                    requestPath = request.mid(firstSpace + 1, secondSpace - firstSpace - 1);
                }

                qDebug() << "Request: " << requestPath;

                // 生成HTTP响应
                QString response = generateResponse(requestPath);

                // 发送HTTP响应
                clientSocket->write(response.toUtf8());
                clientSocket->flush();

                // 关闭客户端连接
                qDebug() << "Client disconnected." ;
                clientSocket->disconnectFromHost();
            });
        }
    });

    return a.exec();
}

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,搭建一个 Web 服务器需要使用一种 Web 服务器软件。常见的 Web 服务器软件有 Apache 和 Nginx 等,但这些软件一般是用 C 语言编写的。如果你要使用 C++ 编写一个 Web 服务器,可以使用第三方库如 Boost.Asio 来实现。 以下是一个简单的 C++ Web 服务器示例代码: ```cpp #include <iostream> #include <boost/asio.hpp> #include <string> using namespace boost::asio; using ip::tcp; using std::string; string make_response(string content) { string response = "HTTP/1.1 200 OK\r\nContent-Length: " + std::to_string(content.length()) + "\r\n\r\n" + content; return response; } int main() { io_service io; tcp::acceptor acceptor(io, tcp::endpoint(tcp::v4(), 8080)); tcp::socket socket(io); while (true) { acceptor.accept(socket); boost::system::error_code ec; char buffer[1024]; size_t n = socket.read_some(buffer, ec); if (ec == error::eof) { break; } else if (ec) { std::cerr << "Error reading from socket: " << ec.message() << "\n"; break; } string request(buffer, n); std::cout << "Received request:\n" << request << "\n"; string response = make_response("Hello, world!"); boost::asio::write(socket, boost::asio::buffer(response)); } return 0; } ``` 这个例子中,我们使用 Boost.Asio 库来监听 8080 端口上的连接请求,并处理客户端发送的 HTTP 请求。当客户端发送请求时,服务器会返回一个包含 "Hello, world!" 的 HTTP 响应。 对于接口的实现,可以在服务器代码中添加处理请求的逻辑,比如解析请求参数、调用其他服务等。具体实现方式会根据业务需求而异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值