gpt4 book ai didi

c++ - 使用套接字跟踪 HTTP 响应 header

转载 作者:行者123 更新时间:2023-11-27 22:48:00 25 4
gpt4 key购买 nike

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

所以基本上我想做的是用我的用户名和密码登录后向 facebook 服务器发送 http post 请求,然后按照 header 重定向链接给我回复。

如果可能,请指导我以正确的方式去做。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);

}

最佳答案

您必须向 301 响应中给出的重定向 URL 发出另一个 HTTP 请求,一个 GET 请求。

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

此外,几乎可以肯定的是,301 响应还为您提供了一些 cookie,Facebook 的服务器希望您在重定向请求中返回给它。否则,您尝试做的任何事情都不会成功。

不幸的是,这里没有捷径,也没有即时的满足。为了正确地做到这一点,您需要了解并熟悉几乎整个 HTTP。 HTTP 的规范引用由 RFC 7230 组成和 RFC 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 .您也需要了解这一点。

附言希望重定向的 URL 不是 https URL,或者 Facebook 允许非加密连接在登录后获取内容。否则,恐怕您需要引入平台的 SSL 库,并且还在整个事情之上编写一个 TLS/SSL session 。

关于c++ - 使用套接字跟踪 HTTP 响应 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41092482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com