#include "stdafx.h" #include "proxy.h" #include
INT StartServer () // Start service {wsadata wsadata; sockaddr_in local; socket listen_socket; if (: wsastartup (0x202, & wsadata)! = 0) {Printf ("/ NERROR in Startup session./n"); wsacleanup () ; return -1;}; local.sin_family = AF_INET; local.sin_addr.s_addr = INADDR_ANY; local.sin_port = htons (pROXYPORT); listen_socket = socket (AF_INET, SOCK_STREAM, 0); if (listen_socket == INVALID_SOCKET) {printf ("/ NERROR in new a socket."); wsacleanup (); return -2;} if (:: bind (listen_socket, (sockaddr *) & local, sizeof (local))! = 0) {printf ("/ n Error in binding socket. "); Wsacleanup (); return -3;}; if (: Listen_Socket, 5)! = 0) {Printf (" / n error in listen. "); Wsacleanup (); return -4;} Glisten_Socket = listen_socket; AFXBEGINTHREAD (UserToproxythread, Null); // Start listening return 1;} int closeServer () // Close service {clossoSocket; wsacleanup (); return 1;} // analysis To the character, get the remote host address int GetDressandport (CHAR * STR, CHAR * Address, Int * Port) {charf [buffs], command [512], proto [128], * p; int J; SSCANF (STR, "% S% S% S", Command, BUF, Proto; P = strstr (buf, http); // httpif (p) {p = Strlen (http); for (int i = 0; i ATOI (P J 1); // Get the port * (p j) = 0;} else * port = 21; strcpy (address, p); p = str, ftp); for (j = 0; j
= False && spair.isuser_proxyclosed == false) {retval = send (spair.proxy_server, buffer, len, 0); if (retval == Socket_ERROR) {Printf ("/ n send () failed: error% d / n" , WSAGetLastError ()); if (SPair.IsProxy_ServerClosed == FALSE) {closesocket (SPair.proxy_server); SPair.IsProxy_ServerClosed = TRUE;} continue;} retval = recv (SPair.user_proxy, Buffer, sizeof (Buffer), 0) ; if (retval == SOCKET_ERROR) {printf ( "/ nError Recv"); if (SPair.IsUser_ProxyClosed == FALSE) {closesocket (SPair.user_proxy); SPair.IsUser_ProxyClosed = TRUE;} continue;} if (retval == 0) {printf ( "Client Close connection / n"); if (SPair.IsUser_ProxyClosed == FALSE) {closesocket (SPair.user_proxy); SPair.IsUser_ProxyClosed = TRUE;} break;} Len = retval; #ifdef _DEBUGBuffer [Len ] = 0; Printf ("/ n Received% D Bytes, DATA [% s] from client / n", retval, buffer; # Endif} // end while if (spair.isproxy_serverclosed == false) {CloseSocket (Spair .proxy_server); SPair.IsProxy_ServerClosed = TRUE;} if (SPair.IsUser_ProxyClosed == FALSE) {closesocket (SPair.user_proxy); SPair.IsUser_ProxyClosed = TRUE;} :: WaitForSingleObject (pCh Ildthread-> m_hthread, 20000); // shop the return valuereturn 0;} // read remote host data, and send it to the local client uint proxytoserver (lpvoid pPARAM) {proxyParam * ppar = (proxyParam *) PParam; char Buffer [BUFSIZE]; char * server_name = "localhost"; unsigned short port; int retval, Len; unsigned int addr; int socket_type; struct sockaddr_in server; struct hostent * hp; SOCKET conn_socket; socket_type = SOCK_STREAM; server_name = pPar-> Address; port = ppar-> port; if (isalpha (server_name [0])) {/ * server address is a name * / hp = gethostbyname (Server_name); } else {/ * convera nnn.nnn address to a usable one * / addr = inet_addr (server_name); hp = gethostbyaddr ((char *) & addr, 4, af_inet);}} = f (hp == null) {fprintf (stderr , "Client: Cannot Resolve Address [% S]: Error% D / N", Server_Name, WsageTlasterror ()); :: set-> user_svrok; return 0;} /// copy the resolved information INTO The RESOLED INTO THE SockAddr_in structure // Memset (& Server, 0, Sizeof (Server)); Memcpy (& (Server.SIN_ADDR), HP-> h_addr, hp-> h_length); server.sin_family = hp-> h_addrtype; server.sin_port = Htons (port); conn_socket = socket (AF_INET, SOCKET_TYPE, 0); / * Open a socket * / if (conn_socket <0) {fprintf (stderr, "client: error opening socket: error% d / n", wsagetlasterror () ); ppar-> ppair-> isproxy_serverclosed = true ;: setevent (ppar-> user_svrok); return -1;} # ifdef _debugprintf ("Client Connecting to:% S / N", HP-> h_name); # endifif (Conn_Socket, (Struct SockAddr *) & Server, SIZEOF (Server)) == Socket_ERROR) {FPRINTF (stderr, "connect () failed:% d / n", wsagetlasterror ()); ppar-> ppair-> isproxy_serverclosed = True; :: setEvent (ppar-> user_svrok; return -1;} ppar-> ppair-> proxy_server = conn_socket; ppar-> ppair-> isproxy_serverclosed = false; :: setnet (ppar-> user_svrok; // cook Up A string to sendwhile {retval = recv (conn_socket, Buffer, sizeof (Buffer), 0) (pPar-> pPair-> IsProxy_ServerClosed && pPar-> pPair-> IsUser_ProxyClosed!!); if (retval == SOCKET_ERROR) {fprintf (stderr , "RECV () failed: error% d / n", wsagetlasterror (); closSocket (conn_socket); ppar-> ppair-> isproxy_serverclosed = true; break;} len = retval; if (retval == 0) {Printf ("