2016-12-10 317 views
0

我一直在试图HTTP POST请求发送给Facebook没有成功我从服务器得到这样的响应:处理HTTP POST请求/响应

HTTP/1.1 400错误的请求的Content-Type:text/html的; charset = utf-8日期: Sat,10 Dec 2016 21:28:17 GMT连接:关闭内容长度:2959

Facebook |错误

抱歉,发生了错误,我们正在努力就可以了,我们会得到它,一旦固定 我们可以

我的代码

#include <iostream> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <netdb.h> 
#include <fstream> 
using namespace std; 

int main() 
{ 
    int s, error; 
    struct sockaddr_in addr; 


     s = socket(AF_INET, SOCK_STREAM, 0); 
    if(s <0) 
    { 
     cout<<"Error 01: creating socket failed!\n"; 
     close(s); 
     return 1; 
    } 

    addr.sin_family = AF_INET; 
    addr.sin_port = htons(80); 
    inet_aton("31.13.90.36",&addr.sin_addr); 

    error = connect(s,(sockaddr*)&addr,sizeof(addr)); 
    if(error!=0) 
    { 
     cout<<"Error 02: conecting to server failed!\n"; 
     close(s); 
     return 1; 
    } 

    const int msgSize = 1042; 
    char msg[] = "POST /login.php?login_attempt=1 \r\n" 
        "HTTP/1.1\r\n" 
        "HOST: facebook.com\r\n\r\n" 
        "Content-type: application/x-www-form-urlencoded\r\n" 
        "Content-Length: 41\r\n" 
        "[email protected]&pass=test123&submit=1\r\n" ; 







    char answ[1042]; 

    //cin.getline(&msg[0],256); 

    send(s,msg,strlen(msg),0); 


    ssize_t len; 
    while((len = recv(s, msg, strlen(msg), 0)) > 0) 
    { 
     cout.write(msg, len); 

     std::cout << std::flush; 
    } 
    if(len < 0) 
    { 
     cout << "error"; 
    } 
    close(s); 

} 

我做错了什么?

回答

2

您的消息中有几处错误。这是你送根据你的代码是什么:

1 POST /login.php?login_attempt=1 \r\n 
2 HTTP/1.1\r\n 
3 HOST: facebook.com\r\n\r\n 
4 Content-type: application/x-www-form-urlencoded\r\n 
5 Content-Length: 41\r\n 
6 [email protected]&pass=test123&submit=1\r\n 

相反,它应该是这样的:

1 POST /login.php?login_attempt=1 HTTP/1.1\r\n 
2 HOST: facebook.com\r\n 
3 Content-type: application/x-www-form-urlencoded\r\n 
4 Content-Length: 41\r\n 
5 \r\n 
6 [email protected]&pass=test123&submit=1 

详细:

  • 1号线和2应该是单行线,即“方法路径HTTP版本”
  • 第3行不应包含多个\r\n
  • 而不是空行\r\n应该是所有HTTP标头(新行5)
  • 第6行中的主体应仅包含内容长度所涵盖的数据。您在此设置的41个字节不包括您发送的\r\n

除此之外,您不能正确解析响应,而是希望服务器在响应完成后关闭连接。由于您使用的是HTTP/1.1,因此您隐式使用持久连接(HTTP保持连接),以便服务器实际上可能会在同一个TCP连接内等待更多请求,并且不会立即关闭连接。

我真的建议你学习standard of HTTP而不是猜测协议是如何工作的。

+0

我没有想到我使用Live HTTP头部应用程序的方式,当我测试新的代码我得到HTTP/1.1 301永久移动 我认为这意味着链接改变我怎么能跟随链接?谢谢你的时间。 – Dota

+0

@AmineDjenaihi:是的,这意味着按照位置标题中给出的链接。 RFC涵盖了这一点。我不知道你使用Live HTTP头看到了什么,但是你有几个换行符错误:你添加了三个不属于那里并删除了它所属的位置。除此之外,浏览器还添加了更多标题,所以我敢肯定你没有复制浏览器的原始请求,而是从你在那里看到的东西中猜出来的。 –

+1

@AmineDjenaihi:再次请[请阅读HTTP规范](https://tools.ietf.org/html/rfc2616)。 301是重定向响应。它包含新网址的“位置”标头。将相同的请求重复到新的URL。 –