在c++应用程序中使用libcurl从. ini文件中的值发送POST数据
Using libcurl in C++ application to send POST data from value in .INI file
所以我有一个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
,这意味着TCHAR
是wchar_t
, CString
是CStringT<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);
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 如何使用curlpp通过POST方法上传文件和json数据
- cpp libcurl 在 HTTP post 调用中发送 zip 文件,而不使用 multipart\form-da
- 使用post [无法上传]在C 中发送文件
- 使用 POST 发送使用 C++ 的文件
- 什么fstream写函数写到文件(编码在post)
- c++ CURL post文件然后得到响应错误
- 在c++应用程序中使用libcurl从. ini文件中的值发送POST数据
- c++ | Winsock -写HTTP Post上传文件的正确方法
- 如何在c++中通过post方法发送数据到php文件
- http post-tinyxml vc++的xml文件大小