C++ HTTP Winsock:在学校"Banned URL",甚至是允许的网站
C++ HTTP Winsock: "Banned URL" at school, even websites that are permitted
我对使用套接字相当陌生,正在做我的第一个项目之一;其中第一个我实际上完全打算在没有任何库的情况下完成。 我使用的是Windows 7,只使用WinAPI。
我正在学校部分研究它,在我的学校,他们有一个网络过滤器,我相信FortiGuard。 即使我尝试在尝试通过 Web 浏览器(例如 google.com(打开时允许的域中获取页面,我也会收到以下消息:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style type="text/css">html,body{height:100%;padding:0;margin:0;}.oc{display:table;width:100%;height:100%;}.ic{display:table-cell;vertical-align:middle;height:100%;}div.msg{display:block;border:1px solid#30c;padding:0;width:500px;font-family:helvetica,sans-serif;margin:10px auto;}h1{font-weight:bold;color:#fff;font-size:14px;margin:0;padding:2px;text-align:center;background: #30c;}p{font-size:12px;margin:15px auto;width:75%;font-family:helvetica,sans-serif;text-align:left;}</style>
<title>The URL you requested has been blocked</title>
</head>
<body><div class="oc"><div class="ic"><div class="msg"><h1>The URL you requested has been blocked</h1><p>The page you have requested has been blocked, because the URL is banned.<br /><br />URL = invalid<br /></p></div></div></div></body>
</html>
(我试图打破一点(。
如您所见,它说URL被禁止,我认为这是网络过滤器,因为这只发生在我在学校时
至少我相信我正在使用正确的标准 HTTP GET 请求来访问在 Web 浏览器上正常工作的网站,但我收到了这条消息。 我对套接字请求做错了什么吗?
这是我的套接字代码:
我有一个基本的"socket_t"结构可以传递给我的所有函数。 这是它的定义:
//custom socket structure
typedef struct
{
//windows-specific
struct sockaddr win_addr;
u_long mode;
SOCKET socket;//acutal SOCKET structure
// General
bool listening;//set to true if actively listening
bool thread_terminate;//when boolean is set to true, listening thread terminates
void (*error_callback) (int);
http_response_t * response;
} socket_t;
对于连接:
//see socket_t definition in socket.h
//returns 0 on success, SOCKET_ERROR on WinSock failure, positive error code on DNS failure
int socket_connect(socket_t * sock, char * addr, int port)
{
//bear in mind sock is the custom socket_t structure. sock->socket is the actual SOCKET structure.
//pardon the nomenclature. rookie code.
//TODO: IPv6 support?
//DNS lookup structures
struct addrinfo * res = NULL;// Result of the getaddrinfo() call
struct sockaddr * sockaddr_v4 = NULL;// IPv4 sockaddr structure
// So-called "hints" structure detailed in the getaddrinfo() MSDN page.
// I guess it contains information for the DNS lookup.
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
//Perform DNS lookup
DWORD getaddrinfo_res = getaddrinfo(addr, "80 ", &hints, &res);//hardcode port number, for now
if(getaddrinfo_res != 0) return getaddrinfo_res;
//for each
for(struct addrinfo * ptr = res; ptr != NULL; ptr = ptr->ai_next)
{
switch(ptr->ai_family)
{
case AF_INET:
sockaddr_v4 = (struct sockaddr *) ptr->ai_addr;//set current address
sock->win_addr = * sockaddr_v4;//set socket address
}
}
//initialize actual SOCKET
sock->socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// TCP/IP, stream-oriented, and TCP rather than UDP; respectively
if(sock->socket == INVALID_SOCKET) return SOCKET_ERROR;
//actual connection
int connect_res = connect(sock->socket, &(sock->win_addr), sizeof(sock->win_addr));
if(connect_res == SOCKET_ERROR) return SOCKET_ERROR;
return 0;
}
和 HTTP 请求位:
// Execute an HTTP request.
// Param 1: socket_t object
// Param 2: resource locator not including site name.
int socket_httprequest(socket_t * sock, char * rl)
{
std::string str_req = std::string("GET /");
str_req.append(rl);
str_req.append(" HTTP/1.0rn");
/*
//user agent header
str_req.append("User-Agent: conley-client/");
str_req.append(VERSION);
str_req.append("rn");
*/
//final newline
str_req.append("rn");
const char * z_req = str_req.c_str();
return send(sock->socket, z_req, (int) strlen(z_req), 0);
}
它们都在主函数中调用,如下所示:
// Initialization
conley::init_sockets();
conley::init_http();
conley::socket_t * sock = conley::socket_alloc(err_callback);
int connect_res = conley::socket_connect(sock, "google.com ", 80);
if(connect_res > 0) std::cout << "DNS ERR " << connect_res << std::endl;
if(connect_res < 0) std::cout << "CONNECT ERR " << WSAGetLastError() << std::endl;
if(connect_res == 0) std::cout << "Connected" << std::endl;
int httpreq_res = conley::socket_httprequest(sock, " ");
if(httpreq_res != -1) std::cout << "HTTP request success: " << httpreq_res << " bytes sent" << std::endl;
else std::cout << "HTTP request failure: Error " << WSAGetLastError() << std::endl;
conley::socket_listen(sock);
谢谢你的时间!
错误可能不是由您的程序引起的,而是因为过滤器检测到请求不是由浏览器发送的。浏览器发送诸如user-agent之类的标头,以向发送请求的服务器标识自己。我的建议是使用像Wireshark这样的工具来捕获浏览器生成的流量,并尝试从您的应用程序中模仿它。
相关文章:
- 如何使用url确定网站协议
- 下载URL中的所有文件
- 使用libcurl提交批量url的正确BING Api POST url是什么
- 如何从网站获取数据并将其传输到数据库?
- 将所有 URL 组织在类中的一个位置
- 网站和C++程序在同一台 Linux PC 上的通信
- 从 C++ 中的 URL 获取结果
- 在加载 MSHTML 文档之前从 MSHTML 文档中删除无效的 URL
- 连接到 URL Sqlite 数据库C++
- 如何在QTextEdit中添加URL或IMAGE-URL
- 从网站复制证书,并使用脚本将其添加到受信任的根证书颁发机构
- c++ 网络浏览器块 url
- PHP Profiler语言 - 使用 C++ 从 PHP 扩展获取客户端 IP 和 URL
- 如何在C++中获取重定向网页的URL
- 访问其他网站后如何获得完整(精确)的URL / QUrl地址?
- C :如何将多个URL从网站HTML提取到向量
- C++ HTTP Winsock:在学校"Banned URL",甚至是允许的网站
- Bing Search,Imgur和Reddit等网站如何从URL生成网站的缩略图
- 创建一个脚本,使我自动登录到由 IP URL 访问的网站,包括"click OK to logon"
- 如何获得网站的url调用NPAPI插件