在c++应用程序中使用libcurl从. ini文件中的值发送POST数据

Using libcurl in C++ application to send POST data from value in .INI file

本文关键字:POST 文件 数据 应用程序 c++ libcurl ini      更新时间:2023-10-16

所以我有一个c++应用程序,从settings.INI文件中的键中获取值,使用libcurl到达PHP页面,发布该数据,它应该返回一些不同的数据。

除了从INI文件中抓取数据之外,它实际上是有效的。如果我显式地为libcurl的POSTFIELDS选项输入(例如:"Serial=454534",而不是存储它从我的文件中检索到的数据的变量)。

这里有一些代码…
PHP:

<?
include("DBHeader.inc.php");
$Serial= $_POST['Serial'];
$sql = "SELECT * FROM `LockCodes` WHERE `sLockCode`="$Serial"";
$RS=mysql_query($sql, $SQLConn);
$num_rows=mysql_num_rows($RS);
if ($num_rows>0)
{
      while ($row = mysql_fetch_array($RS))
  {
       echo $row['iLockCodeID'];
  }
}
else
{
  echo "...";
}

?>

c++代码片段:

TCHAR szKeyValue[36];
GetPrivateProfileString(_T("Test"), _T("LockCode"), _T(""), szKeyValue, 36, _T("C:\Test\Settings.INI"));
CString sLockCode = szKeyValue;
CURL *curl;
CURLcode res;
CString Serial = _T("Serial=") + sLockCode;
string LCID;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if (curl)
{
    curl_easy_setopt(curl, CURLOPT_URL, "http://regserver2.nyksys.com/GetLCID.php");
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, Serial);
    res = curl_easy_perform(curl);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &writeCallback);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
    res = curl_easy_perform(curl);
    if (data == _T("..."))
    {
        data = "0";
        AfxMessageBox("Invalid Serial Number");
        exit(0);
    }

My Settings.INI是标准格式的。

[Test]
LockCode=1D4553C7E7228E462DBAAE267977B7CDED8A

发生的是,每当我使用变量"Serial"而不是输入它时,PHP页面返回"…"而不是期望的结果。

我觉得我错过了一些明显的东西。

我猜您已经定义了_UNICODE,这意味着TCHARwchar_t, CStringCStringT<wchar_t>,代码:

curl_easy_setopt(curl, CURLOPT_POSTFIELDS, Serial);
当函数期望一个窄字符串时,

实际上传递一个宽字符串给curl_easy_setopt()。如果您的机器是小端序,那么curl_easy_setopt()将参数解释为字符串"Sx00ex00rx00ix00...(在大端序机器上,它是"x00Sx00ex00rx00i...),并且因为curl_easy_setopt()将在没有设置CURLOPT_POSTFIELDSIZE时使用strlen(),所以小端序机器上的整个POST请求体是S。例如,请参阅http://codepad.org/JE2MYZfU

你需要做的是使用窄字符串:

#define ARRAY_LEN(arr_id) ((sizeof (arr_id))/(sizeof ((arr_id)[0])))
char szKeyValue[36];
GetPrivateProfileStringA("Test", "LockCode", "", szKeyValue, ARRAY_LEN(szKeyValue), "C:\Test\Settings.INI");
CURL *curl;
CURLcode res;
CStringT<char> Body = CStringT<char>("Serial=") + szKeyValue;
string LCID;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if (curl)
{
    curl_easy_setopt(curl, CURLOPT_URL, "http://regserver2.nyksys.com/GetLCID.php");
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, Body);
    res = curl_easy_perform(curl);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &writeCallback);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
    res = curl_easy_perform(curl);
//...

而且,你的PHP脚本看起来很容易受到SQL注入。

EDIT:还有一件事您是否将CURLOPT_POST设置为1?

    curl_easy_setopt(curl, CURLOPT_POST, 1);