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
无法接收HTTP响应正文C++; 首先,这里是我用来制作HTTP POST请求的C++代码。它链接到ws2_32.lib int POST_TEST(std::string URL, std::string DATA) { //************************************************** std::string TEXT = ""; std::string DIRECTORY = URL.substr(URL.find(".com") + std::string(".com").length()); std::string HOST = URL.substr(0, URL.find(".com", std::string(".com").length())) + ".com"; std::string REQ = "POST " + DIRECTORY + " HTTP/1.1\r\nContent-Length: " + to_string(DATA.length()) + "\r\nAccept-Language: en-US,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nHost: " + HOST + "\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:44.0) Gecko/20100101 Firefox/44.0\r\nConnection: keep-alive\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n" + DATA; const char * REQUEST = REQ.c_str(); //************************************************** WSADATA wsaData; if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) return 1; SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); struct hostent *host = gethostbyname(HOST.c_str()); SOCKADDR_IN SockAddr; SockAddr.sin_port = htons(80); SockAddr.sin_family = AF_INET; SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr); if(connect(Socket,(SOCKADDR*)(&SockAddr), sizeof(SockAddr)) != 0) return 1; send(Socket, REQUEST, strlen(REQUEST), 0); char buffer[1000]; int nDataLength; while((nDataLength = recv(Socket, buffer, 1000, 0)) > 0) { int i = 0; while(buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') { TEXT += buffer[i]; i++; } } closesocket(Socket); WSACleanup(); MessageBoxA(NULL, TEXT.c_str(), "HTTP Response", MB_OK); return 0; } POST_TEST("blah.com/a.php", "a=blah");_C++_Http_Post_Http Headers_Httpresponse - Fatal编程技术网

无法接收HTTP响应正文C++; 首先,这里是我用来制作HTTP POST请求的C++代码。它链接到ws2_32.lib int POST_TEST(std::string URL, std::string DATA) { //************************************************** std::string TEXT = ""; std::string DIRECTORY = URL.substr(URL.find(".com") + std::string(".com").length()); std::string HOST = URL.substr(0, URL.find(".com", std::string(".com").length())) + ".com"; std::string REQ = "POST " + DIRECTORY + " HTTP/1.1\r\nContent-Length: " + to_string(DATA.length()) + "\r\nAccept-Language: en-US,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nHost: " + HOST + "\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:44.0) Gecko/20100101 Firefox/44.0\r\nConnection: keep-alive\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n" + DATA; const char * REQUEST = REQ.c_str(); //************************************************** WSADATA wsaData; if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) return 1; SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); struct hostent *host = gethostbyname(HOST.c_str()); SOCKADDR_IN SockAddr; SockAddr.sin_port = htons(80); SockAddr.sin_family = AF_INET; SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr); if(connect(Socket,(SOCKADDR*)(&SockAddr), sizeof(SockAddr)) != 0) return 1; send(Socket, REQUEST, strlen(REQUEST), 0); char buffer[1000]; int nDataLength; while((nDataLength = recv(Socket, buffer, 1000, 0)) > 0) { int i = 0; while(buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') { TEXT += buffer[i]; i++; } } closesocket(Socket); WSACleanup(); MessageBoxA(NULL, TEXT.c_str(), "HTTP Response", MB_OK); return 0; } POST_TEST("blah.com/a.php", "a=blah");

无法接收HTTP响应正文C++; 首先,这里是我用来制作HTTP POST请求的C++代码。它链接到ws2_32.lib int POST_TEST(std::string URL, std::string DATA) { //************************************************** std::string TEXT = ""; std::string DIRECTORY = URL.substr(URL.find(".com") + std::string(".com").length()); std::string HOST = URL.substr(0, URL.find(".com", std::string(".com").length())) + ".com"; std::string REQ = "POST " + DIRECTORY + " HTTP/1.1\r\nContent-Length: " + to_string(DATA.length()) + "\r\nAccept-Language: en-US,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nHost: " + HOST + "\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:44.0) Gecko/20100101 Firefox/44.0\r\nConnection: keep-alive\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n" + DATA; const char * REQUEST = REQ.c_str(); //************************************************** WSADATA wsaData; if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) return 1; SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); struct hostent *host = gethostbyname(HOST.c_str()); SOCKADDR_IN SockAddr; SockAddr.sin_port = htons(80); SockAddr.sin_family = AF_INET; SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr); if(connect(Socket,(SOCKADDR*)(&SockAddr), sizeof(SockAddr)) != 0) return 1; send(Socket, REQUEST, strlen(REQUEST), 0); char buffer[1000]; int nDataLength; while((nDataLength = recv(Socket, buffer, 1000, 0)) > 0) { int i = 0; while(buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') { TEXT += buffer[i]; i++; } } closesocket(Socket); WSACleanup(); MessageBoxA(NULL, TEXT.c_str(), "HTTP Response", MB_OK); return 0; } POST_TEST("blah.com/a.php", "a=blah");,c++,http,post,http-headers,httpresponse,C++,Http,Post,Http Headers,Httpresponse,代码运行良好,但我只收到HTTP头响应,没有看到响应体。使用Python将POST请求发送到同一个php页面可以让我很好地看到响应体。我不确定我是否误解了什么,或者我的代码中有错误 我发布到的PHP页面位于我自己的服务器上。PHP回显了一些文本,但我在响应中没有看到。这是我得到的答复: HTTP/1.1 200 OK Server: nginx/1.8.1 Date: Fri, 08 Apr 2016 02:10:14 GMT Content-Type: text/html Content-Le

代码运行良好,但我只收到HTTP头响应,没有看到响应体。使用Python将POST请求发送到同一个php页面可以让我很好地看到响应体。我不确定我是否误解了什么,或者我的代码中有错误

我发布到的PHP页面位于我自己的服务器上。PHP回显了一些文本,但我在响应中没有看到。这是我得到的答复:

HTTP/1.1 200 OK
Server: nginx/1.8.1
Date: Fri, 08 Apr 2016 02:10:14 GMT
Content-Type: text/html
Content-Length: 286
Connection: keep-alive
Vary: Accept-Encoding
Content-Encoding: gzip

如何才能看到整个响应?

显示的代码中有两个错误

  • 它不会检查
    send()
    中的返回值
    send()
    不保证请求发送的字节数已实际发送。
    send()
    的返回值可能会返回一个指示,表明写入的字节数少于请求的字节数。您有责任对此进行检查,然后再次尝试
    send()
    发送剩余的字节

  • 读取和收集响应的逻辑是错误的
    recv()
    告诉您接收了多少字节。这完全被忽略了。相反,代码扫描读取缓冲区,直到它将控制字符视为字节

请注意,您的HTTP响应表明您正在获取原始的、经过gzip压缩的二进制数据。在实际响应的前几个字节中,很可能会有一些二进制字节,其值与ASCII控制字符相对应。此时,您的循环将突然停止


即使您希望得到纯文本响应,这种逻辑仍然是错误的。它是来自
recv()
的返回值,告诉您接收了多少字节,而不是其他任何内容。

显示的代码中有两个错误

  • 它不会检查
    send()
    中的返回值
    send()
    不保证请求发送的字节数已实际发送。
    send()
    的返回值可能会返回一个指示,表明写入的字节数少于请求的字节数。您有责任对此进行检查,然后再次尝试
    send()
    发送剩余的字节

  • 读取和收集响应的逻辑是错误的
    recv()
    告诉您接收了多少字节。这完全被忽略了。相反,代码扫描读取缓冲区,直到它将控制字符视为字节

请注意,您的HTTP响应表明您正在获取原始的、经过gzip压缩的二进制数据。在实际响应的前几个字节中,很可能会有一些二进制字节,其值与ASCII控制字符相对应。此时,您的循环将突然停止


即使您希望得到纯文本响应,这种逻辑仍然是错误的。它是来自
recv()
的返回值,告诉您收到了多少字节,而不是其他任何内容。

显示您得到的响应。这可能是HTTP重定向。@谢谢SamVarshavchik,但不是HTTP重定向。我更新了我的问题。内容编码是GZip。只有在
buffer[i]>=32 | | buffer[i]='\n'| | buffer[i]='\r'
时才能复制。展示你得到的回应。这可能是HTTP重定向。@谢谢SamVarshavchik,但不是HTTP重定向。我更新了我的问题。内容编码是GZip。只有在
buffer[i]>=32 | | buffer[i]='\n'| | buffer[i]='\r'
时才能复制。感谢您的回复,但是您能否发布一些关于如何修复此问题的示例代码?这段代码最初来自Stackoverflow上的其他地方,我只是复制了它,并尝试实现它。我还是很差的C++,如果你想学习C++,这是最糟糕的方法。得到一本关于C++的书,然后从更简单的东西开始。与读取和写入文件类似,而不是尝试与HTTP服务器进行对话。你不学习C++,而是复制你不懂的代码,并试图使它有效。stackoverflow.com不是教程网站,也不是代码编写服务。这就是我25年前学习C++的方式。我买了一本书,开始阅读。当时没有stackoverflow.com。不知怎么地,我成功地做到了。好吧,我实际上已经远远超过了初学者阶段,我已经编程了几年,但我的观点是C++是相当困难的,我还有很长的路要走…我很清楚堆栈溢出不是一种代码编写服务,我所要求的只是一段代码来演示。谢谢,但无论如何,我只是通过将Accept Encoding留空来修复它,所以我不必为压缩而烦恼。谢谢您的回复,但是您能发布一些如何修复此问题的示例代码吗?这段代码最初来自Stackoverflow上的其他地方,我只是复制了它,并尝试实现它。我还是很差的C++,如果你想学习C++,这是最糟糕的方法。得到一本关于C++的书,然后从更简单的东西开始。与读取和写入文件类似,而不是尝试与HTTP服务器进行对话。你不学习C++,而是复制你不懂的代码,并试图使它有效。stackoverflow.com不是教程网站,也不是代码编写服务。这就是我25年前学习C++的方式。我买了一本书,开始阅读。当时没有stackoverflow.com。不知怎么地,我成功地做到了。好吧,我实际上已经远远超过了初学者阶段,我已经编程了几年,但我的观点是C++是相当困难的,我还有很长的路要走…我很清楚堆栈溢出不是一种代码编写服务,我所要求的只是一段代码来演示。谢谢,但不管怎样,我只是将Accept编码保留为空来修复它,所以我不必为压缩而烦恼。