在C语言中,你可以使用cJson库来建立一个HTTP服务器,以接收Qt发送的POST请求的post data。以下是一个示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <cjson/cJSON.h>

#define PORT 8080

void handle_post_data(int client_socket, char* post_data) {
    // 解析post data为cJSON对象
    cJSON* json = cJSON_Parse(post_data);
    if (json == NULL) {
        printf("Failed to parse JSON: %s\n", cJSON_GetErrorPtr());
        return;
    }

    // 读取post data中的字段
    cJSON* name = cJSON_GetObjectItemCaseSensitive(json, "name");
    cJSON* age = cJSON_GetObjectItemCaseSensitive(json, "age");

    // 打印post data中的字段值
    printf("Name: %s\n", name->valuestring);
    printf("Age: %d\n", age->valueint);

    // 释放cJSON对象
    cJSON_Delete(json);
}

int main() {
    int server_fd, client_socket;
    struct sockaddr_in server_addr, client_addr;
    int addrlen = sizeof(client_addr);

    // 创建socket
    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd == -1) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    // 设置服务器地址和端口
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(PORT);

    // 绑定socket
    if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    // 监听socket
    if (listen(server_fd, 3) == -1) {
        perror("listen failed");
        exit(EXIT_FAILURE);
    }

    printf("Server listening on port %d\n", PORT);

    while (1) {
        // 接收客户端连接
        client_socket = accept(server_fd, (struct sockaddr*)&client_addr, (socklen_t*)&addrlen);
        if (client_socket == -1) {
            perror("accept failed");
            exit(EXIT_FAILURE);
        }

        char buffer[1024] = {0};
        read(client_socket, buffer, 1024);

        // 提取post data
        char* post_data = strstr(buffer, "\r\n\r\n");
        if (post_data != NULL) {
            post_data += 4;
            handle_post_data(client_socket, post_data);
        }

        // 发送响应
        char* response = "HTTP/1.1 200 OK\nContent-Type: text/plain\nContent-Length: 12\n\nHello World!";
        write(client_socket, response, strlen(response));

        // 关闭客户端socket
        close(client_socket);
    }

    // 关闭服务器socket
    close(server_fd);

    return 0;
}

在这个示例中,我们使用了cJson库来解析POST请求的post data。首先,我们创建了一个socket并绑定到指定的端口。然后,我们通过循环等待客户端连接。当客户端连接成功时,我们从socket中读取数据,并提取出POST请求的post data。接下来,我们使用cJson库解析post data,并提取出其中的字段值。最后,我们发送一个简单的响应给客户端。

你可以在Qt中使用QNetworkAccessManager来发送POST请求,并在请求中添加post data。以下是一个示例代码:

#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QByteArray>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QNetworkAccessManager manager;
    QNetworkRequest request(QUrl("http://localhost:8080"));

    // 设置请求头
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");

    // 设置post data
    QByteArray postData;
    postData.append("name=John&age=30");

    // 发送POST请求
    QNetworkReply* reply = manager.post(request, postData);

    // 接收响应
    QObject::connect(reply, &QNetworkReply::finished, [&]() {
        if (reply->error() == QNetworkReply::NoError) {
            QByteArray response = reply->readAll();
            qDebug() << response;
        } else {
            qDebug() << "Error: " << reply->errorString();
        }

        // 释放QNetworkReply对象
        reply->deleteLater();

        // 退出应用程序
        a.quit();
    });

    return a.exec();
}

在这个示例中,我们创建了一个QNetworkAccessManager对象来发送POST请求。我们首先创建一个QNetworkRequest对象,并设置请求的URL和请求头。然后,我们创建一个QByteArray对象来存储POST请求的post data。接下来,我们使用manager的post()函数来发送POST请求,并将post data作为参数传递。最后,我们使用QNetworkReply对象来接收响应,并在finished信号中处理响应数据。

请注意,在运行这个示例之前,你需要先运行上面的C语言代码来启动HTTP服务器

c linux 使用cJson 建立 http服务器如何接收 Qt 发送http的post请求的postdata

原文地址: https://www.cveoy.top/t/topic/iCRT 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录