我想知道如何使用Socket通过代理发出HTTP请求。
我正在浏览互联网上的文档,许多人说要做到这一点我必须连接到代理服务器并发送带有以下标题的数据包:
send(Socket, "CONNECT http://icanhazip.com:80 HTTP/1.0\r\n\r\n", strlen("CONNECT http://icanhazip.com:80 HTTP/1.0\r\n\r\n"), 0);
该网站返回当前的公共IP,但不幸的是,我尝试的每个代理服务器都返回了错误而不是网页的HTML源。
这是我的实际代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
try {
int Socket = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in SockAddr;
memset(&SockAddr, 0, sizeof(SockAddr));
SockAddr.sin_port = htons(80);
SockAddr.sin_family = AF_INET;
SockAddr.sin_addr.s_addr = inet_addr("198.169.246.30");
int iResult = connect(Socket, (struct sockaddr *)& SockAddr, sizeof(SockAddr));
if (iResult != 0) {
std::cout << "I can't connect :(.";
getchar();
return 1;
}
std::cout << "Connected.\n";
send(Socket, "CONNECT http://icanhazip.com:80 HTTP/1.1\r\n\r\n", strlen("CONNECT http://icanhazip.com:80 HTTP/1.1\r\n\r\n"), 0);
char buffer[10000];
int nDataLength;
while ((nDataLength = recv(Socket, buffer, 10000, 0)) > 0) {
int i = 0;
while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
std::cout << buffer[i];
i += 1;
}
}
iResult = close(Socket);
}
catch (...) {
}
return 0;
}
我该怎么做才能修复它?或者,我应该研究哪种其他解决方案?
答案 0 :(得分:0)
中国古老的谚语说,“在编写代码之前,最好先阅读规范”
https://tools.ietf.org/html/rfc7230
通过以下文档中的链接:
发送CONNECT请求的客户端必须发送权限形式 请求目标([RFC7230]第5.3节);即,请求目标 仅包含隧道的主机名和端口号 目的地,用冒号分隔。例如,
CONNECT server.example.com:80 HTTP/1.1 Host: server.example.com:80