#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;}
基于tcp的简单http服务接口实现(POST http://ip:port/test)
于 2023-12-05 08:55:08 首次发布