使用套接字

时间:2016-12-11 23:55:31

标签: c++ sockets http unix http-headers

我的代码中有问题我确实向Facebook服务器发送了HTTP请求,但问题是我得到HTTP / 1.1 301永久移动 信息。 我想要做的是允许按照标题响应链接,并给我重定向的页面HTML, 此外,我尝试发送另一个HTTP请求,但我得不到任何响应,所以我认为有功能选项,允许我按照标题链接。

所以基本上我正在尝试做的是这个发送http发送请求到facebook服务器用我的用户和密码登录跟随标题重定向链接给我回复。

如果可能的话,请指导我做正确的方法。 PS:我已经阅读了一些RFC,但仍然不清楚。 谢谢你的时间。

我的代码

#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 <iostream>
#include <string>
#include <cstring>
#include <cstdlib> 
using namespace std;

int main()
{
    int sockid, status;
    unsigned strSize; 
    ssize_t count; // 

    struct sockaddr_in addr; // struct 
    ssize_t size = sizeof(addr);

    sockid = socket(PF_INET, SOCK_STREAM, 0); // create socket

    if(sockid < 0) //if error 
    {
        cout<<"Cannot create sucket\n";
        close(sockid);
        exit(EXIT_FAILURE);
    }
    // access struct 
    addr.sin_family = AF_INET;
    addr.sin_port = htons(80);
    if(inet_aton("31.13.90.36",&addr.sin_addr) == 0)
    {
        cout << "Wrong address";
        close(sockid);
        exit(-1);
    }

    status = connect(sockid, (sockaddr*)&addr, sizeof(addr)); // attempt to establish a connection 
    // check
    if(status < 0)
    {
        cout << "failed to establish a connection";
        close(sockid);
        exit(EXIT_FAILURE);
    }

    // sending HTTP request 
     char msg[] = "POST /login.php HTTP/1.1\r\n"
                  "HOST: m.facebook.com\r\n"
                  "Content-type: application/x-www-form-urlencoded\r\n"
                  "Content-Length: 147\r\n"
                  "Connection: Keep-Alive\r\n"
                  "\r\n"
                  "lsd=AVp5UV4F&version=1&ajax=0&width=0&pxr=0&gps=0&dimensions=0&m_ts=1481464104&li=KFlNWFL78UFJkrUnTV_sFFDQ&email=Minglixe&pass=test123&login=Log+In";



    const int bufSize = 4000;    
    char * buf;
    buf = new char [bufSize];
    //unsigned bufSize = strlen(buf);
    strSize = strlen(msg);


    send(sockid, msg, strSize, 0); // send request 

    while((count = recv(sockid, buf, bufSize, 0)) > 0)// receive the request 
    {
        buf[count] = '\0';
        cout << buf << flush;

    }    

   if(count < 0 ) 
    {   
        cout << "error" ;
        exit(EXIT_FAILURE);
    }

   delete[] buf;

    close(sockid);

}

1 个答案:

答案 0 :(得分:4)

您必须向301响应中指定的重定向网址发出另一个HTTP请求GET请求。

您需要关闭此套接字,并为新请求创建一个新套接字。如果重定向的URL是针对同一个域的,那么您可以实现HTTP / 1.1流水线操作并省去拆除一个套接字并创建一个新套接字的麻烦,但这样就太过分了。

此外,几乎可以肯定的是,301响应还在重定向的请求中为您提供了一些Cookie,Facebook的服务器将指望您返回它。否则你所做的一切都没有任何工作机会。

不幸的是,这里没有捷径,也没有即时的满足感。为了正确地执行此操作,您需要了解并熟悉HTTP的全部内容。 HTTP的规范参考由RFC 7230RFC 7231组成(还有RFC 7232RFC 7233RFC 7234RFC 7235RFC 7236RFC 7237,但我不相信你需要它们用于你的特定目的)。我将在RFC 7230和7231中将您引导至权威来源,而不是在此处复制粘贴块。

HTTP并不是那么复杂,但它不是几个小时内可以吸收的东西,比如POP3。准备投入几天时间来审查HTTP的技术规范并进行研究。当我实现我自己的全功能HTTP 1.1客户端时,花了我几个月的时间(通过我的业余时间)通过RFC 2616的前身工作,并破解了支持cookie的HTTP 1.1客户端。

此外,为了让您的HTTP客户端处理cookie,有关如何处理cookie的规范参考是RFC 6265。你也需要了解它。

P.S。希望重定向的URL不是https URL,或者Facebook允许非加密连接在登录后获取内容。否则,我担心,您需要引入平台的SSL库,并编写代码整个事情之上的TLS / SSL会话。