¡¶¼ÆËã»úÍøÂ硷ʵÑéÖ¸µ¼Êé(Èí¼þѧԺ2015) - ͼÎÄ ÁªÏµ¿Í·þ

·¢²¼Ê±¼ä : ÐÇÆÚÈý ÎÄÕ¡¶¼ÆËã»úÍøÂ硷ʵÑéÖ¸µ¼Êé(Èí¼þѧԺ2015) - ͼÎĸüÐÂÍê±Ï¿ªÊ¼ÔĶÁca79e137ec630b1c59eef8c75fbfc77da26997fc

¡¶¼ÆËã»úÍøÂ硷ʵÑéÖ¸µ¼Êé

wVersionRequested = MAKEWORD(2, 2); //¼ÓÔØdllÎļþScoket¿â err = WSAStartup(wVersionRequested, &wsaData); if(err != 0){ //ÕÒ²»µ½winsock.dll printf(\¼ÓÔØwinsockʧ°Ü£¬´íÎó´úÂëΪ: %d\\n\ return FALSE; } if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) !=2) { printf(\²»ÄÜÕÒµ½ÕýÈ·µÄwinsock°æ±¾\\n\ WSACleanup(); return FALSE; } ProxyServer= socket(AF_INET, SOCK_STREAM, 0); if(INVALID_SOCKET == ProxyServer){ printf(\´´½¨Ì×½Ó×Öʧ°Ü£¬´íÎó´úÂëΪ£º%d\\n\ return FALSE; } ProxyServerAddr.sin_family = AF_INET; ProxyServerAddr.sin_port = htons(ProxyPort); ProxyServerAddr.sin_addr.S_un.S_addr = INADDR_ANY; if(bind(ProxyServer,(SOCKADDR*)&ProxyServerAddr,sizeof(SOCKADDR)) == SOCKET_ERROR){ printf(\°ó¶¨Ì×½Ó×Öʧ°Ü\\n\ return FALSE; } if(listen(ProxyServer, SOMAXCONN) == SOCKET_ERROR){ printf(\¼àÌý¶Ë¿Ú%dʧ°Ü\ return FALSE; } return TRUE; } //************************************ // Method: ProxyThread // FullName: ProxyThread // Access: public // Returns: unsigned int __stdcall // Qualifier: Ïß³ÌÖ´Ðк¯Êý // Parameter: LPVOID lpParameter //************************************ unsigned int __stdcall ProxyThread(LPVOID lpParameter){ char Buffer[MAXSIZE];

9

¡¶¼ÆËã»úÍøÂ硷ʵÑéÖ¸µ¼Êé

char *CacheBuffer; ZeroMemory(Buffer,MAXSIZE); SOCKADDR_IN clientAddr; int length = sizeof(SOCKADDR_IN); int recvSize; int ret; recvSize = recv(((ProxyParam *)lpParameter)->clientSocket,Buffer,MAXSIZE,0); if(recvSize <= 0){ goto error; } HttpHeader* httpHeader = new HttpHeader(); CacheBuffer = new char[recvSize + 1]; ZeroMemory(CacheBuffer,recvSize + 1); memcpy(CacheBuffer,Buffer,recvSize); ParseHttpHead(CacheBuffer,httpHeader); delete CacheBuffer; if(!ConnectToServer(&((ProxyParam *)lpParameter)->serverSocket,httpHeader->host)) { goto error; } printf(\´úÀíÁ¬½ÓÖ÷»ú %s ³É¹¦\\n\ //½«¿Í»§¶Ë·¢Ë͵ÄHTTPÊý¾Ý±¨ÎÄÖ±½Óת·¢¸øÄ¿±ê·þÎñÆ÷ ret = send(((ProxyParam *)lpParameter)->serverSocket,Buffer,strlen(Buffer) + 1,0); //µÈ´ýÄ¿±ê·þÎñÆ÷·µ»ØÊý¾Ý recvSize = recv(((ProxyParam *)lpParameter)->serverSocket,Buffer,MAXSIZE,0); if(recvSize <= 0){ goto error; } //½«Ä¿±ê·þÎñÆ÷·µ»ØµÄÊý¾ÝÖ±½Óת·¢¸ø¿Í»§¶Ë ret = send(((ProxyParam *)lpParameter)->clientSocket,Buffer,sizeof(Buffer),0); //´íÎó´¦Àí error: printf(\¹Ø±ÕÌ×½Ó×Ö\\n\ Sleep(200); closesocket(((ProxyParam*)lpParameter)->clientSocket); closesocket(((ProxyParam*)lpParameter)->serverSocket); delete lpParameter; _endthreadex(0); return 0; }

10

¡¶¼ÆËã»úÍøÂ硷ʵÑéÖ¸µ¼Êé

//************************************ // 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 = \ p = strtok_s(buffer,delim,&ptr);//ÌáÈ¡µÚÒ»ÐÐ printf(\ if(p[0] == 'G'){//GET·½Ê½ memcpy(httpHeader->method,\ memcpy(httpHeader->url,&p[4],strlen(p) -13); }else if(p[0] == 'P'){//POST·½Ê½ memcpy(httpHeader->method,\ memcpy(httpHeader->url,&p[5],strlen(p) - 14); } printf(\ 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,\ memcpy(httpHeader->cookie,&p[8],strlen(p) -8); } } break; default: break; } p = strtok_s(NULL,delim,&ptr);

11

¡¶¼ÆËã»úÍøÂ硷ʵÑéÖ¸µ¼Êé

} } //************************************ // Method: ConnectToServer // FullName: ConnectToServer // Access: public // Returns: BOOL // Qualifier: ¸ù¾ÝÖ÷»ú´´½¨Ä¿±ê·þÎñÆ÷Ì×½Ó×Ö£¬²¢Á¬½Ó // 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; } 7.ʵÑ鱨¸æ

ÔÚʵÑ鱨¸æÖÐÐèÒª×ܽá˵Ã÷£º

£¨1£©Socket±à³ÌµÄ¿Í»§¶ËºÍ·þÎñÆ÷¶ËÖ÷Òª²½Ö裻 £¨2£©HTTP´úÀí·þÎñÆ÷µÄ»ù±¾Ô­Àí£» £¨3£©HTTP´úÀí·þÎñÆ÷µÄ³ÌÐòÁ÷³Ìͼ£»

£¨4£©ÊµÏÖHTTP´úÀí·þÎñÆ÷µÄ¹Ø¼ü¼¼Êõ¼°½â¾ö·½°¸£» £¨5£©HTTP´úÀí·þÎñÆ÷ʵÑéÑéÖ¤¹ý³ÌÒÔ¼°ÊµÑé½á¹û£» £¨6£©HTTP´úÀí·þÎñÆ÷Ô´´úÂ루´øÓÐÏêϸעÊÍ£©¡£

12