Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过HttpOpenRequestA发送POST数据_C++_Sockets_Winapi_Wininet - Fatal编程技术网

C++ 通过HttpOpenRequestA发送POST数据

C++ 通过HttpOpenRequestA发送POST数据,c++,sockets,winapi,wininet,C++,Sockets,Winapi,Wininet,我正在尝试将我的电脑名发送到本地服务器,并将其保存在文件中 这是我的代码: #include <stdio.h> #include <windows.h> #include <iostream> #include <fstream> #include <string> #include <string.h> #include <cstring> #include <Lmcons.h> #include

我正在尝试将我的电脑名发送到本地服务器,并将其保存在文件中

这是我的代码:

#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <string.h>
#include <cstring>
#include <Lmcons.h>
#include <unistd.h>
#include <stdlib.h>
#include <WinInet.h>
#include <bits/stdc++.h>
#pragma comment( lib,"Wininet.lib")
using namespace std;

int main() {
    TCHAR name [ UNLEN + 1 ];
    DWORD size = UNLEN + 1;
    static CHAR hdrs[] = "Content-Type: application/x-www-form-urlencoded";
    if (GetUserName( (TCHAR*)name, &size ));
    static CHAR frmdata[] = "data=", name;

    HINTERNET hSession = InternetOpenA("http generic", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    HINTERNET hConnect = InternetConnect(hSession, "127.0.0.1", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
    HINTERNET hRequest = HttpOpenRequestA(hConnect, "POST", "/test/index.php", NULL, NULL, NULL, 0, 1);
    HttpSendRequestA(hRequest, hdrs, strlen(hdrs), frmdata, strlen(frmdata));
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#pragma注释(lib,“Wininet.lib”)
使用名称空间std;
int main(){
TCHAR名称[UNLEN+1];
DWORD大小=UNLEN+1;
静态字符hdrs[]=“内容类型:应用程序/x-www-form-urlencoded”;
if(GetUserName((TCHAR*)name和size));
静态字符frmdata[]=“data=”,名称;
HINTERNET hSession=InternetOpenA(“http通用”,互联网开放类型,空,空,0);
HINTERNET hConnect=InternetConnect(hsSession,“127.0.0.1”,INTERNET\u默认\u HTTP\u端口,NULL,NULL,INTERNET\u服务\u HTTP,0,1);
HINTERNET hRequest=HttpOpenRequestA(hConnect,“POST”,“/test/index.php”,NULL,NULL,NULL,0,1);
HttpSendRequestA(hRequest、hdrs、strlen(hdrs)、frmdata、strlen(frmdata));
}
我试过使用
静态字符frmdata[]=“data=“+name也可以,但不起作用。
这是我收到的错误:

错误:“const char[6]”和“TCHAR[257]{aka char[257]}”类型的操作数对二进制“operator+”无效|


您需要连接,std::string可以为您做这件事。您还应该使用相同的基本字符类型,以避免需要额外的转换

char name [ UNLEN + 1 ];
DWORD size = UNLEN + 1;
GetUserNameA( name, &size );
std::string frmdata;
frmdata += "data=";
frmdata += name;

...

HttpSendRequestA(hRequest, hdrs, strlen(hdrs), frmdata.data(), (DWORD)frmdata.size());

如果您想传输unicode数据(在这种情况下使用
std::wstring
),您需要将数据字符串转换为正确的utf-8(查找
WideCharToMultiByte
)。

您不能像尝试那样连接
char[]
数组。分配一个足够大的单独缓冲区,并将输入字符串复制到其中,例如:

#包括
#包括
#包括
#包括
//#包括
使用名称空间std;
#pragma注释(lib,“Wininet.lib”)
int main()
{
静态字符hdrs[]=“内容类型:应用程序/x-www-form-urlencoded”;
字符名[UNLEN+1]={};
DWORD大小=UNLEN+1;
GetUserNameA(名称和大小);
char frmdata[5+UNLEN+1]={};
strcpy(frmdata,“data=”);
strcat(frmdata,名称);
//或者:
//sprintf(frmdata,“数据=%s”,名称);
HINTERNET hSession=InternetOpenA(“http通用”,互联网开放类型,空,空,0);
如果(!hs会话){
//错误处理。。。
}
HINTERNET hConnect=InternetConnectA(hsSession,“127.0.0.1”,INTERNET\u默认\u HTTP\u端口,NULL,NULL,INTERNET\u服务\u HTTP,0,1);
如果(!hConnect){
//错误处理。。。
}
HINTERNET hRequest=HttpOpenRequestA(hConnect,“POST”,“/test/index.php”,NULL,NULL,NULL,0,1);
如果(!hRequest){
//错误处理。。。
}
如果(!HttpSendRequestA(hRequest、hdrs、strlen(hdrs)、frmdata、strlen(frmdata))){
//错误处理。。。
}
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hsSession);
返回0;
}
或者,您可以使用单个缓冲区,只需将其增大,并让
GetUserNameA()
填充其中的一部分,之后就不需要进行复制,例如:

intmain()
{
...
char frmdata[5+UNLEN+1]=“data=”;
DWORD大小=UNLEN+1;
GetUserNameA(&frmdata[5],&size);
...
}

谢谢你的回答,我试过了,得到了这个
错误:错误:从'const void*'到'LPVOID{aka void*}'[-fppermissive].
std::string::c_str()
的转换无效返回一个
const char*
HttpSendRequestA()
的第四个参数采用非常量
void*
。因此,您需要一个非常量
char*
,您可以通过丢弃
const
来获得它,例如:
const\u cast(frmdata.c\u str())
,或者简单地使用
&frmdata[0]
,或者在c++17及更高版本中使用
frmdata.data()