通过libcurl和NodeJS的数据交换问题

问题描述 投票:0回答:1

我有一个用 C 语言编写的 Windows x64 客户端,需要将文本发送到 NodeJS 服务器,因此我使用 libcurl 来实现此目的,但它不起作用,数据似乎无法到达服务器。

这是客户端部分:

#ifndef WINDOWS_BACKUP_SCHEDULER_H
    #define WINDOWS_BACKUP_SCHEDULER_H

    #ifndef NULL
        #define NULL (void *)0;
    #endif

    #include <stdbool.h>
    #include <stdio.h>
    #include <time.h>
    #include <tchar.h>
    #include <winsock2.h>
    #include <iphlpapi.h>
    #include <curl/curl.h>
    #include <windows.h>

    struct MemoryStruct {
        char *memory;
        size_t size;
    };
    WORD SendHWID(PCHAR HWID);
#endif

static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) {
    size_t realsize = size * nmemb;
    struct MemoryStruct *mem = (struct MemoryStruct *)userp;

    mem->memory = realloc(mem->memory, mem->size + realsize + 1);
    if (mem->memory == NULL) {
        return (1);
    }
    memcpy(&(mem->memory[mem->size]), contents, realsize);
    mem->size += realsize;
    mem->memory[mem->size] = 0;
    printf("Key : %s", mem->memory);
    return realsize;
}

WORD SendHWID(PCHAR HWID) {
    PCHAR URL = "http://127.0.0.1:3000/hwid";
    CURL *curl = NULL;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if (!curl) {
        curl_easy_cleanup(curl);
        curl_global_cleanup();
        return (1);
    }

    curl_easy_setopt(curl, CURLOPT_URL, URL);
    curl_easy_setopt(curl, CURLOPT_POST, true);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, HWID);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
    res = curl_easy_perform(curl);

    if(res != CURLE_OK) {
        curl_easy_cleanup(curl);
        curl_global_cleanup();
        return (1);
    }

    curl_easy_cleanup(curl);
    curl_global_cleanup();
    return (0);
}

int main(void)
{
    SendHWID("Hello World!");
    return (0);
}

这是服务器部分:

const express = require('express');
const crypto = require('crypto-js');

const app = express();
const port = 3000;

app.use(express.json());

app.post('/hwid', (req, res) => {
    const HWID = req.body;
    const hash = crypto.SHA3(HWID, { outputLength: 512 }).toString();
    const clientIP = req.ip || req.connection.remoteAddress;
    console.log(`[+] New HWID query : ${clientIP} | HWID : ${HWID} | Hash : ${hash}`);
    res.send(hash);
});

app.listen(port, () => {
    console.log(`[i] Server listening at ${port}`);
});

这是服务器的控制台输出:

[i] Server listening at 3000
[+] New HWID query : ::ffff:127.0.0.1 | HWID : [object Object] | Hash : 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

这是客户端的控制台输出:

D:\WMP\Training\Windows_Backup_Scheduler\build>.\windows_backup_scheduler.exe
y : Ke

你能解释一下如何让我的客户端和服务器正常通信吗?

node.js c libcurl
1个回答
0
投票

没关系:

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);

但是您错过了要传递给回调的数据:

curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)data);

此数据可以从

main
传递,例如:

WORD SendHWID(PCHAR HWID, struct MemoryStruct *data) {
    ...
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&data);
    ...
}

int main(void)
{
    struct MemoryStruct data = {0}; // or calloc ...

    SendHWID("Hello World!", &data);
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.