基于tcp的简单http服务接口实现(POST http://ip:port/test)

#include <iostream>
#include <string>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>

using namespace std;
const int BUFFER_SIZE = 1024;
void send_response(int client_socket, const string& message) 
{
    string response = "HTTP/1.1 200 OK\r\n";
    response += "Content-Type: text/plain\r\n";
    response += "Content-Length: " + to_string(message.length()) + "\r\n";
    response += "\r\n" + message;

    const char* buffer = response.c_str();
    int length = response.length();
    int sent = 0;
    do {
        int n = send(client_socket, buffer + sent, length - sent, 0);
        if(n == -1) {
            cerr << "Error: Failed to send data" << endl;
            break;
        }
        sent += n;
    } while(sent < length);
}

int main()
 {
    // 创建 TCP 套接字
    int server_socket = socket(AF_INET, SOCK_STREAM, 0);
    if(server_socket == -1)
     {
        cerr << "Error: Failed to create server socket." << endl;
        return 1;
    }
    // 绑定监听地址
    sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(6060);  
    if(bind(server_socket, reinterpret_cast<sockaddr*>(&server_addr), sizeof(server_addr)) == -1) 
	{
        cerr << "Error: Failed to bind server socket." << endl;
        close(server_socket);
        return 1;
    }
    // 开始监听连接请求
    if(listen(server_socket, SOMAXCONN) == -1) 
    {
        cerr << "Error: Failed to listen incoming connections." << endl;
        close(server_socket);
        return 1;
    }

    cout << "Server is running on http://0.0.0.0/lizewei" << endl;

    while(true) 
    {
        // 等待客户端连接请求
        sockaddr_in client_addr;
        socklen_t client_addr_len = sizeof(client_addr);
        int client_socket = accept(server_socket, reinterpret_cast<sockaddr*>(&client_addr), &client_addr_len);
        if(client_socket == -1) 
		{
            cerr << "Error: Failed to accept incoming connection." << endl;
            continue;
        }
		char ip_address[INET_ADDRSTRLEN];
		inet_ntop(AF_INET, &(client_addr.sin_addr), ip_address, INET_ADDRSTRLEN);
		uint16_t port = ntohs(client_addr.sin_port);
		std::cout << "connect client IP : " << ip_address << std::endl;
		std::cout << "connect client port: " << port << std::endl;
        // 读取客户端请求消息
        char buffer[BUFFER_SIZE] = {0};
        int received = recv(client_socket, buffer, sizeof(buffer), 0);
        if(received <= 0) 
		{
            close(client_socket);
            continue;
        }

        // 解析 HTTP 请求消息
        string message(buffer, received);
        if(message.find("/test") != string::npos && message.find("POST") != string::npos)
         {
            // 处理 POST 请求
            size_t body_pos = message.find("\r\n\r\n");
            string body = message.substr(body_pos + 4);  // 忽略消息头部分

            // 修改返回内容
            size_t pos = body.find("test=");
            if(pos != string::npos) 
			{
                string test_value = body.substr(pos + 5);
                int test_number = stoi(test_value);
                test_number += 1;
                body = "test=" + to_string(test_number);
            }

            send_response(client_socket, body);
        }
        else 
		{
            string body = "Not Found";
            send_response(client_socket, body);
        }

        // 关闭客户端连接
        close(client_socket);
    }
    // 关闭服务器套接字
    close(server_socket);
    return 0;}
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值