Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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++ 使用winsock发送POST数据(并使用PHP服务器端脚本接收)_C++_Http_Post_Winsock - Fatal编程技术网

C++ 使用winsock发送POST数据(并使用PHP服务器端脚本接收)

C++ 使用winsock发送POST数据(并使用PHP服务器端脚本接收),c++,http,post,winsock,C++,Http,Post,Winsock,所以我想我应该稍微使用HTTP,并尝试将简单的纯文本(非编码)从我的程序发送到服务器。然而,有些事情是不对的,我不知道是什么 这是服务器端的PHP脚本,我通过从HTML表单发送POST数据对其进行了测试,效果非常好,所以我猜服务器端没有任何问题 <?php $file = 'postData.txt'; $somecontent = $_POST['dat']; $fp = fopen($file, 'w') or die('Could not open file!'); fwri

所以我想我应该稍微使用HTTP,并尝试将简单的纯文本(非编码)从我的程序发送到服务器。然而,有些事情是不对的,我不知道是什么

这是服务器端的PHP脚本,我通过从HTML表单发送POST数据对其进行了测试,效果非常好,所以我猜服务器端没有任何问题

<?php
$file = 'postData.txt'; 
$somecontent = $_POST['dat'];
$fp = fopen($file, 'w') or die('Could not open file!');   
fwrite($fp, "$somecontent") or die('Could not write to file');  
fclose($fp);  
?>

以下是程序(此代码包括一些未使用的部分,如读取缓冲区中的文件内容等,这是因为我一直在玩它,并且每5秒更改一次内容,不要介意):

#包括
#包括“WinSock2.h”
#包括
#包括
#包括
int main()
{
WSADATA wsa;
if(WSAStartup(MAKEWORD(2,2),&wsa)!=0)
返回0;
SOCKET fd=SOCKET(AF\u INET、SOCK\u STREAM、IPPROTO\u TCP);
如果(fd<0)抛出;
正在使用的SOCKADDR_;
service.sinu family=AF\u INET;
service.sinu port=htons(80);
LPHOSTENT主机=gethostbyname(“123.17.25.123”);
如果(!主机)抛出;
service.sin\u addr=*((LPIN\u addr)*主机->地址列表);
if(connect(fd,(SOCKADDR*)和service,sizeof(service))<0)抛出;
FILE*f=fopen(“FILE.txt”、“rb”);
如果(!f)抛出;
uint32_t len=0;
fseek(f,0x00,SEEK_END);
len=ftell(f);
fseek(f,0x00,SEEK_SET);
字符头[1024];
char*buffer=新字符[len];
fread(缓冲区,大小f(char),len,f);
斯普林特(头球,
“POST/recv.php HTTP/1.1\r\n”
“主机:123.17.25.123\r\n”
“用户代理:Mozilla Firefox/4.0\r\n”
“内容长度:%d\r\n”
“内容类型:application/x-www-form-urlencoded\r\n”
“接受字符集:utf-8\r\n\r\n”,
len+4);

std::coutPOST应该在数据前有两个换行符,而不是在数据后

    "Accept-Charset: utf-8\r\n\r\n"
    "dat=somedata\r\n",

您没有接收到数据,因为您实际上没有发送任何数据。虽然
缓冲区
出现在
sprintf
中,但没有格式说明符来使用它(只有长度被格式化)

尝试从sprintf调用中删除
缓冲区
,然后调用
发送
两次,一次用于标题(正如您已经做的那样),然后再次发送实际数据


或者,您可能不想从读取的文件中发送任何数据。您只想获取
dat=somedatar
。问题是您将内容类型指示为
text/plain
,在这种情况下,服务器根本不会解释它。内容类型可能应该是
application/x-www-form-urlencoded
。因为
dat
参数是正文的一部分,
内容长度
必须包含它。如果内容长度与作为内容发送的实际字节数不匹配,一致性服务器将忽略整个请求(通常返回400-499范围的响应代码).

谢谢!虽然没有变化,但我仍然没有收到数据。
    "Accept-Charset: utf-8\r\n\r\n"
    "dat=somedata\r\n",