#include <stdio.h>#include <Windows.h>#include <process.h>#include <string.h>#include <tchar.h> #pragma comment(lib,&#34;Ws2_32.lib&#34;)#define MAXSIZE" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > (計算機網(wǎng)絡(luò)實驗1)HTTP 代理服務(wù)器的設(shè)計與實現(xiàn)

(計算機網(wǎng)絡(luò)實驗1)HTTP 代理服務(wù)器的設(shè)計與實現(xiàn)

時間:2023-09-01 03:24:01 | 來源:網(wǎng)站運營

時間:2023-09-01 03:24:01 來源:網(wǎng)站運營

(計算機網(wǎng)絡(luò)實驗1)HTTP 代理服務(wù)器的設(shè)計與實現(xiàn):@toc

#include <stdio.h>#include <Windows.h>#include <process.h>#include <string.h>#include <tchar.h> #pragma comment(lib,"Ws2_32.lib")#define MAXSIZE 65507 //發(fā)送數(shù)據(jù)報文的最大長度#define HTTP_PORT 80 //http 服務(wù)器端口//Http重要頭部數(shù)據(jù)struct HttpHeader { char method[4]; // POST 或者 GET,注意有些為 CONNECT,本實驗暫不考慮 char url[1024]; // 請求的 url char host[1024]; // 目標主機 char cookie[1024 * 10]; //cookie HttpHeader() { ZeroMemory(this, sizeof(HttpHeader)); };};//禁止訪問的網(wǎng)站和釣魚網(wǎng)站是否可以輸入選擇char Invilid_web[1024] = "http://today.hit.edu.cn/";//不允許訪問的網(wǎng)站//char Invilid_web[1024] = "https://today.edu.cn/";char Target_web[1024] = "http://ids-hit-edu-cn.ivpn.hit.edu.cn";//統(tǒng)一身份認證網(wǎng)站char Fish_web[1024] = "http://jwes.hit.edu.cn/";//釣魚網(wǎng)站char Fish_host[1024] = "jwes.hit.edu.cn"; //釣魚主機名BOOL InitSocket();void ParseHttpHead(char* buffer, HttpHeader* httpHeader);BOOL ConnectToServer(SOCKET* serverSocket, char* host);unsigned int __stdcall ProxyThread(LPVOID lpParameter);//代理相關(guān)參數(shù)SOCKET ProxyServer;//代理服務(wù)器sockaddr_in ProxyServerAddr;//代理服務(wù)器地址const int ProxyPort = 10240;//設(shè)置代理窗口//緩存相關(guān)參數(shù)boolean haveCache = false;boolean needCache = true;void getfileDate(FILE* in, char* tempDate);void sendnewHTTP(char* buffer, char* datestring);void makeFilename(char* url, char* filename);void storefileCache(char* buffer, char* url);void checkfileCache(char* buffer, char* filename);//由于新的連接都使用新線程進行處理,對線程的頻繁的創(chuàng)建和銷毀特別浪費資源//可以使用線程池技術(shù)提高服務(wù)器效率//const int ProxyThreadMaxNum = 20;//HANDLE ProxyThreadHandle[ProxyThreadMaxNum] = {0};//DWORD ProxyThreadDW[ProxyThreadMaxNum] = {0};;;struct ProxyParam { SOCKET clientSocket; SOCKET serverSocket;};//主程序int _tmain(int argc, _TCHAR* argv[]){ printf("代理服務(wù)器正在啟動/n"); printf("初始化.../n"); if (!InitSocket()) { printf("socket 初始化失敗/n"); return -1; } printf("代理服務(wù)器正在運行,監(jiān)聽端口 %d/n", ProxyPort); SOCKET acceptSocket = INVALID_SOCKET; //把socket設(shè)置成無效套接字 ProxyParam* lpProxyParam; HANDLE hThread; DWORD dwThreadID;//unsigned long,無符號32位整型 //代理服務(wù)器不斷監(jiān)聽 while (TRUE) { acceptSocket = accept(ProxyServer, NULL, NULL); lpProxyParam = new ProxyParam;//新的客戶端和服務(wù)器端 if (lpProxyParam == NULL) { continue; } lpProxyParam->clientSocket = acceptSocket; //線程開始 hThread = (HANDLE)_beginthreadex(NULL, 0, &ProxyThread, (LPVOID)lpProxyParam, 0, 0); CloseHandle(hThread); Sleep(2000); } closesocket(ProxyServer); WSACleanup(); return 0;}//************************************// Method: InitSocket// FullName: InitSocket// Access: public// Returns: BOOL// Qualifier: 初始化套接字//************************************BOOL InitSocket() { //加載套接字庫(必須) WORD wVersionRequested; WSADATA wsaData; //套接字加載時錯誤提示 int err; //版本 2.2 wVersionRequested = MAKEWORD(2, 2); //加載 dll 文件 Scoket 庫 err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) { //找不到 winsock.dll printf("加載 winsock 失敗,錯誤代碼為: %d/n", WSAGetLastError()); return FALSE; } if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { printf("不能找到正確的 winsock 版本/n"); WSACleanup(); return FALSE; } //創(chuàng)建套接字 ProxyServer = socket(AF_INET, SOCK_STREAM, 0); if (INVALID_SOCKET == ProxyServer) { printf("創(chuàng)建套接字失敗,錯誤代碼為: %d/n", WSAGetLastError()); return FALSE; } ProxyServerAddr.sin_family = AF_INET;//地址族 ProxyServerAddr.sin_port = htons(ProxyPort); // 設(shè)置代理端口 //ProxyServerAddr.sin_addr.S_un.S_addr = INADDR_ANY;//設(shè)置IP地址 ProxyServerAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//設(shè)置IP地址 //bind綁定 if (bind(ProxyServer, (SOCKADDR*)& ProxyServerAddr, sizeof(SOCKADDR)) == SOCKET_ERROR) { printf("綁定套接字失敗/n"); return FALSE; } //listen監(jiān)聽,SOMAXCONN由系統(tǒng)來決定請求隊列長度 if (listen(ProxyServer, SOMAXCONN) == SOCKET_ERROR) { printf("監(jiān)聽端口%d 失敗", ProxyPort); return FALSE; } return TRUE;}//************************************// Method: ProxyThread// FullName: ProxyThread// Access: public// Returns: unsigned int __stdcall// Qualifier: 線程執(zhí)行函數(shù)// Parameter: LPVOID lpParameter//************************************unsigned int __stdcall ProxyThread(LPVOID lpParameter) { char Buffer[MAXSIZE]; char* CacheBuffer; char* DateBuffer; char filename[100] = { 0 }; _Post_ _Notnull_ FILE* in; char date_str[30]; //保存字段Date的值 ZeroMemory(Buffer, MAXSIZE); SOCKADDR_IN clientAddr; int length = sizeof(SOCKADDR_IN); int recvSize; int ret; FILE* fp; //第一次接收客戶端請求,將該請求緩存下來,存到本地文件中 recvSize = recv(((ProxyParam*)lpParameter)->clientSocket, Buffer, MAXSIZE, 0); HttpHeader* httpHeader = new HttpHeader(); if (recvSize <= 0) { goto error; } CacheBuffer = new char[recvSize + 1]; ZeroMemory(CacheBuffer, recvSize + 1); memcpy(CacheBuffer, Buffer, recvSize); ParseHttpHead(CacheBuffer, httpHeader); //printf("HTTP請求報文如下:/n%s/n", Buffer); ZeroMemory(date_str, 30); printf("httpHeader->url : %s/n", httpHeader->url); makeFilename(httpHeader->url, filename); //printf("filename是 %s/n", filename); if ((fopen_s(&in, filename, "r")) == 0) { printf("/n有緩存/n"); //fread_s(fileBuffer, MAXSIZE, sizeof(char), MAXSIZE, in); getfileDate(in,date_str);//得到本地緩存文件中的日期date_str fclose(in); //printf("date_str:%s/n", date_str); sendnewHTTP(Buffer, date_str); //向服務(wù)器發(fā)送一個請求,該請求需要增加 “If-Modified-Since” 字段 //服務(wù)器通過對比時間來判斷緩存是否過期 haveCache = TRUE; } //printf("httpHeader的url是%s,不允許訪問的是%s/n", httpHeader->url, Invilid_web); //網(wǎng)站過濾功能 if (strcmp(httpHeader->url, Invilid_web) == 0) { printf("%s網(wǎng)站被拒絕訪問", Invilid_web); goto error; } //添加釣魚功能 if (strstr(httpHeader->url, Target_web) != NULL) { printf("%s網(wǎng)站釣魚成功,被轉(zhuǎn)移至%s/n", Target_web, Fish_web); memcpy(httpHeader->host, Fish_host, strlen(Fish_host) + 1);//替換主機名 memcpy(httpHeader->url, Fish_web, strlen(Fish_web) + 1);//替換url } //此時數(shù)據(jù)報存儲在了httpHeader中 delete CacheBuffer; //連接發(fā)送數(shù)據(jù)報所在的服務(wù)器 if (!ConnectToServer(&((ProxyParam*)lpParameter)->serverSocket, httpHeader->host)) { printf("連接目的服務(wù)器失敗/n"); goto error; } printf("代理連接主機 %s 成功/n", httpHeader->host); //將客戶端發(fā)送的 HTTP 數(shù)據(jù)報文直接轉(zhuǎn)發(fā)給目標服務(wù)器 ret = send(((ProxyParam*)lpParameter)->serverSocket, Buffer, strlen(Buffer) + 1, 0); //等待目標服務(wù)器返回數(shù)據(jù) recvSize = recv(((ProxyParam*)lpParameter)->serverSocket, Buffer, MAXSIZE, 0); if (recvSize <= 0) { goto error; } //printf("服務(wù)器響應報文如下:/n%s/n", Buffer); if (haveCache == true) { checkfileCache(Buffer, httpHeader->url); } if (needCache == true) { storefileCache(Buffer, httpHeader->url); } //將目標服務(wù)器返回的數(shù)據(jù)直接轉(zhuǎn)發(fā)給客戶端 ret = send(((ProxyParam*)lpParameter)->clientSocket, Buffer, sizeof(Buffer), 0); //錯誤處理error: printf("關(guān)閉套接字/n"); Sleep(200); closesocket(((ProxyParam*)lpParameter)->clientSocket); closesocket(((ProxyParam*)lpParameter)->serverSocket); delete lpParameter; _endthreadex(0); //終止線程 return 0;}//************************************// Method: ParseHttpHead// FullName: ParseHttpHead// Access: public// Returns: void// Qualifier: 解析 TCP 報文中的 HTTP 頭部// Parameter: char * buffer// Parameter: HttpHeader * httpHeader//************************************void ParseHttpHead(char* buffer, HttpHeader* httpHeader) { char* p; char* ptr; const char* delim = "/r/n"; p = strtok_s(buffer, delim, &ptr);//提取第一行 printf("%s/n", p); if (p[0] == 'G') {//GET 方式 memcpy(httpHeader->method, "GET", 3); memcpy(httpHeader->url, &p[4], strlen(p) - 13); } else if (p[0] == 'P') {//POST 方式 memcpy(httpHeader->method, "POST", 4); memcpy(httpHeader->url, &p[5], strlen(p) - 14); } printf("%s/n", httpHeader->url); p = strtok_s(NULL, delim, &ptr); while (p) { switch (p[0]) { case 'H'://Host memcpy(httpHeader->host, &p[6], strlen(p) - 6); break; case 'C'://Cookie if (strlen(p) > 8) { char header[8]; ZeroMemory(header, sizeof(header)); memcpy(header, p, 6); if (!strcmp(header, "Cookie")) { memcpy(httpHeader->cookie, &p[8], strlen(p) - 8); } } break; default: break; } p = strtok_s(NULL, delim, &ptr); }}//************************************// Method: ConnectToServer// FullName: ConnectToServer// Access: public// Returns: BOOL// Qualifier: 根據(jù)主機創(chuàng)建目標服務(wù)器套接字,并連接// Parameter: SOCKET * serverSocket// Parameter: char * host//************************************BOOL ConnectToServer(SOCKET* serverSocket, char* host) { sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(HTTP_PORT); HOSTENT* hostent = gethostbyname(host); if (!hostent) { return FALSE; } in_addr Inaddr = *((in_addr*)* hostent->h_addr_list); serverAddr.sin_addr.s_addr = inet_addr(inet_ntoa(Inaddr)); *serverSocket = socket(AF_INET, SOCK_STREAM, 0); if (*serverSocket == INVALID_SOCKET) { return FALSE; } if (connect(*serverSocket, (SOCKADDR*)& serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { closesocket(*serverSocket); return FALSE; } return TRUE;}//訪問本地文件,獲取本地緩存中的日期void getfileDate(FILE* in, char* tempDate) { char field[5] = "Date"; char* p, * ptr, temp[5]; char buffer[MAXSIZE]; ZeroMemory(buffer, MAXSIZE); fwrite(buffer, sizeof(char), MAXSIZE, in); const char* delim = "/r/n";//換行符 ZeroMemory(temp, 5); p = strtok_s(buffer, delim, &ptr); int len = strlen(field) + 2; while (p) { if (strstr(p, field) != NULL) {//調(diào)用strstr后指針會指向匹配剩余的第一個字符 memcpy(tempDate, &p[len], strlen(p) - len); return; } p = strtok_s(NULL, delim, &ptr); }}//改造HTTP請求報文void sendnewHTTP(char* buffer, char* datestring) { const char* field = "Host"; const char* newfield = "If-Modified-Since: "; //const char *delim = "/r/n"; char temp[MAXSIZE]; ZeroMemory(temp, MAXSIZE); char* pos = strstr(buffer, field);//獲取請求報文段中Host后的部分信息 int i = 0; for (i = 0; i < strlen(pos); i++) { temp[i] = pos[i];//將pos復制給temp } *pos = '/0'; while (*newfield != '/0') { //插入If-Modified-Since字段 *pos++ = *newfield++; } while (*datestring != '/0') {//插入對象文件的最新被修改時間 *pos++ = *datestring++; } *pos++ = '/r'; *pos++ = '/n'; for (i = 0; i < strlen(temp); i++) { *pos++ = temp[i]; }}//根據(jù)url構(gòu)造文件名void makeFilename(char* url, char* filename) { while (*url != '/0') { if ('a' <= *url && *url <= 'z') { *filename++ = *url; } url++; } strcat_s(filename, strlen(filename) + 9, "110.txt");}//檢測主機返回的狀態(tài)碼,如果是200則本地獲取緩存void storefileCache(char* buffer, char* url) { char* p, * ptr, tempBuffer[MAXSIZE + 1]; //num中是狀態(tài)碼 const char* delim = "/r/n"; ZeroMemory(tempBuffer, MAXSIZE + 1); memcpy(tempBuffer, buffer, strlen(buffer)); p = strtok_s(tempBuffer, delim, &ptr);//提取第一行 //printf("tempbuffer = %s/n", p); if (strstr(tempBuffer, "200") != NULL) { //狀態(tài)碼是200時緩存 char filename[100] = { 0 }; makeFilename(url, filename); printf("filename : %s/n", filename); FILE* out; fopen_s(&out, filename, "w+"); fwrite(buffer, sizeof(char), strlen(buffer), out); fclose(out); printf("/n===================網(wǎng)頁已經(jīng)被緩存==================/n/n"); }}//檢測主機返回的狀態(tài)碼,如果是304則從本地獲取緩存進行轉(zhuǎn)發(fā),否則需要更新緩存void checkfileCache(char* buffer, char* filename) { char* p, * ptr, tempBuffer[MAXSIZE + 1]; const char* delim = "/r/n"; ZeroMemory(tempBuffer, MAXSIZE + 1); memcpy(tempBuffer, buffer, strlen(buffer)); p = strtok_s(tempBuffer, delim, &ptr);//提取狀態(tài)碼所在行 //主機返回的報文中的狀態(tài)碼為304時返回已緩存的內(nèi)容 if (strstr(p, "304") != NULL) { printf("/n=================從本機獲得緩存====================/n/n"); ZeroMemory(buffer, strlen(buffer)); FILE* in = NULL; if ((fopen_s(&in, filename, "r")) == 0) { fread(buffer, sizeof(char), MAXSIZE, in); fclose(in); } needCache = FALSE; }}

教訓

  1. 不了解 fopen_s與fopen區(qū)別,如果不想用安全函數(shù)fopen_s,可以添加_CRT_SECURE_NO_WARNINGS(項目->屬性->C/C++->預處理器->預處理器定義中添加_CRT_SECURE_NO_WARNINGS)
  2. 不了解 strtok_s 與strtok
  3. 文件路徑無效(例如.110txt),filename,產(chǎn)生報錯: Debug assertion failed. Program:xxxxxxxxx Line xxx Expression:(stream!=NULL)
  4. 目標服務(wù)器屢次連接失?。赡苁切@網(wǎng)斷了……)

參考知識

代理服務(wù)器定義

允許一個網(wǎng)絡(luò)終端(一般為客戶端)通過這個服務(wù)與另一個網(wǎng)絡(luò)終端(一般為服務(wù)器)進行非直接的連接。如圖所示,為普通 Web 應用通信方式與采用代理服務(wù)器的通信方式的對比。

在這里插入圖片描述



代理服務(wù)器原理

代理服務(wù)器在指定端口(例如 8080) 監(jiān)聽瀏覽器的訪問請求(需要在客戶端瀏覽器進行相應的設(shè)置), 接收到瀏覽器對遠程網(wǎng)站的瀏覽請求時,代理服務(wù)器開始在代理服務(wù)器的緩存中檢索 URL 對應的對象(網(wǎng)頁、圖像等對象),找到對象文件后, 提取該對象文件的最新被修改時間; 代理服務(wù)器程序在客戶的請求報文首部插入,并向原 Web 服務(wù)器轉(zhuǎn)發(fā)修改后的請求報文。 如果代理服務(wù)器沒有該對象的緩存,則會直接向原服務(wù)器轉(zhuǎn)發(fā)請求報文, 并將原服務(wù)器返回的響應直接轉(zhuǎn)發(fā)給客戶端,同時將對象緩存到代理服務(wù)器中。 代理服務(wù)器程序會根據(jù)緩存的時間、大小和提取記錄等對緩存進行清理。本實驗需實現(xiàn)一個簡單的 HTTP 代理服務(wù)器, 可以分為兩個步驟:(首先請設(shè)置瀏覽器開啟本地代理,注意設(shè)置代理端口與代理服務(wù)器監(jiān)聽端口保持一致)。

單用戶代理服務(wù)器

單用戶的簡單代理服務(wù)器可以設(shè)計為一個非并發(fā)的循環(huán)服務(wù)器。 首先, 代理服務(wù)器創(chuàng)建 HTTP 代理服務(wù)的 TCP 主套接字, 通過該主套接字監(jiān)聽等待客戶端的連接請求。 當客戶端連接之后, 讀取客戶端的 HTTP請求報文, 通過請求行中的 URL, 解析客戶期望訪問的原服務(wù)器 IP 地址;創(chuàng)建訪問原(目標)服務(wù)器的 TCP 套接字,將 HTTP 請求報文轉(zhuǎn)發(fā)給目標服務(wù)器,接收目標服務(wù)器的響應報文,當收到響應報文之后, 將響應報文轉(zhuǎn)發(fā)給客戶端, 最后關(guān)閉套接字, 等待下一次連接。

多用戶代理服務(wù)器

多用戶的簡單代理服務(wù)器可以實現(xiàn)為一個多線程并發(fā)服務(wù)器。 首先,代理服務(wù)器創(chuàng)建 HTTP 代理服務(wù)的 TCP 主套接字, 通過該主套接字監(jiān)聽等待客戶端的連接請求。 當客戶端連接之后, 創(chuàng)建一個子線程,由子線程執(zhí)行上述一對一的代理過程, 服務(wù)結(jié)束之后子線程終止。 與此同時,主線程繼續(xù)接受下一個客戶的代理服務(wù)。

實驗目的

熟悉并掌握 Socket 網(wǎng)絡(luò)編程的過程與技術(shù);深入理解 HTTP協(xié)議,掌握 HTTP 代理服務(wù)器的基本工作原理;掌握 HTTP 代理服務(wù)器設(shè)計與編程實現(xiàn)的基本技能。

實驗內(nèi)容

  1. 設(shè)計并實現(xiàn)一個基本 HTTP 代理服務(wù)器。 要求在指定端口(例如8080) 接收來自客戶的 HTTP 請求并且根據(jù)其中的 URL 地址訪問該地址所指向的 HTTP 服務(wù)器(原服務(wù)器), 接收 HTTP 服務(wù)器的響應報文,并將響應報文轉(zhuǎn)發(fā)給對應的客戶進行瀏覽。
  2. 設(shè)計并實現(xiàn)一個支持 Cache 功能的 HTTP 代理服務(wù)器。 要求能緩存原服務(wù)器響應的對象,并能夠通過修改請求報文(添加 if-modified-since頭行),向原服務(wù)器確認緩存對象是否是最新版本。(選作內(nèi)容,加分項目,可以當堂完成或課下完成)
  3. 擴展 HTTP 代理服務(wù)器,支持如下功能: a) 網(wǎng)站過濾:允許/不允許訪問某些網(wǎng)站; b) 用戶過濾:支持/不支持某些用戶訪問外部網(wǎng)站; c) 網(wǎng)站引導:將用戶對某個網(wǎng)站的訪問引導至一個模擬網(wǎng)站(釣魚)。

實驗過程

設(shè)置瀏覽器代理

以IE瀏覽器設(shè)置為例:打開瀏覽器工具瀏覽器選項——連接——局域網(wǎng)設(shè)置——代理服務(wù)器。設(shè)置地址為127.0.0.1,端口號為10240。

在這里插入圖片描述



實現(xiàn)一個基本的HTTP代理服務(wù)器

HTTP代理服務(wù)器用于一個網(wǎng)絡(luò)終端(一般為客戶端)通過代理服務(wù)與另一個網(wǎng)絡(luò)終端(一般為服務(wù)器)進行非直接的連接。設(shè)計的流程圖如下:

在這里插入圖片描述
(1) InitSocket()函數(shù) 功能:初始化套接字 (2) ProxyThread()函數(shù) 功能:線程執(zhí)行函數(shù) (3) ParseHttpHead()函數(shù) 功能:解析 TCP 報文中的 HTTP 頭部 (4) ConnectToServer()函數(shù) 功能:根據(jù)主機創(chuàng)建目標服務(wù)器套接字,并連接

Cache功能

  1. 客戶端第一次請求服務(wù)器中的數(shù)據(jù)時,代理服務(wù)器將該請求返回的響應緩存下來,存到本地的文件下。
  2. 當客戶端第二次訪問該數(shù)據(jù)時,代理服務(wù)器檢查本地是否有該請求的響應,如果沒有,則繼續(xù)緩存;如果有,則通過向服務(wù)器發(fā)送一個請求,對比最后修改時間來判斷緩存是否過期,如果服務(wù)器返回狀態(tài)碼304,則沒過期;如果服務(wù)器返回狀態(tài)碼200,則緩存過期,則更新本地緩存。
  3. 相應函數(shù) (1)getfileDate()函數(shù) 功能:訪問本地文件,獲取本地緩存中的日期 (2)sendnewHTTP()函數(shù) 功能:修改請求報文,添加 if-modified-since頭行 先查看請求報文格式: (3)checkfileCache()函數(shù) 功能:檢測主機返回的狀態(tài)碼,如果是304則從本地獲取緩存進行轉(zhuǎn)發(fā),否則需要更新緩存 (4)storefileCache()函數(shù) 功能:檢測主機返回的狀態(tài)碼,如果是200則本地獲取緩存

實現(xiàn)擴展功能

網(wǎng)站過濾

首先設(shè)置不允許訪問網(wǎng)站的url

在這里插入圖片描述
在處理客戶端請求時,檢查請求消息中的url是否被允許訪問,如果不允許訪問,則拒絕

在這里插入圖片描述



用戶過濾

將代理服務(wù)器的網(wǎng)絡(luò)通信IP地址從INADDR_ANY更改為特定的某個IP地址,從而只有該IP地址能通過 代理服務(wù)器訪問外部網(wǎng)站,其他IP均不能

在這里插入圖片描述



網(wǎng)站引導

首先設(shè)置目標網(wǎng)站和相應的釣魚網(wǎng)站和主機名

在這里插入圖片描述
在處理客戶端請求時,將請求消息中的url和host替換成事先設(shè)置好的模擬網(wǎng)站的url和host

在這里插入圖片描述



實驗結(jié)果

  1. 設(shè)計并實現(xiàn)一個基本 HTTP 代理服務(wù)器。
  2. 設(shè)計并實現(xiàn)一個支持 Cache 功能的 HTTP 代理服務(wù)器。
  3. 擴展 HTTP 代理服務(wù)器,支持如下功能: a) 網(wǎng)站過濾:允許/不允許訪問某些網(wǎng)站; b) 用戶過濾:支持/不支持某些用戶訪問外部網(wǎng)站; c) 網(wǎng)站引導:將用戶對某個網(wǎng)站的訪問引導至一個模擬網(wǎng)站(釣魚)。

題目與源碼

github代碼鏈接

關(guān)鍵詞:設(shè)計,實現(xiàn),服務(wù),網(wǎng)絡(luò),實驗,代理,計算機

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉