我有一个用 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
你能解释一下如何让我的客户端和服务器正常通信吗?
没关系:
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;
}