///////////////////////////////////////////////////////////////////////////// // Rev 11/12/2003 // // // GET.C // ----- // // // Sylvain MARECHAL - sylvain.marechal1@libertysurf.fr ///////////////////////////////////////////////////////////////////////////// // // Simple GET // Utilisation : // get // // Soit, en passant par un proxy myproxy de port 8080, si on demande la // page d'accueil de www.yahoo.com // get myproxy 8080 www.yahoo.com 80 / // // En etant en connection directe // get www.yahoo.com 80 www.yahoo.com 80 / // // ///////////////////////////////////////////////////////////////////////////// #ifdef _WIN32 #include #define SOCKET_ERRNO WSAGetLastError() #define ERRNO GetLastError() #else #define SOCKET_ERRNO errno #define ERRNO errno #endif #include #include #include #include #include #include ///////////////////////////////////////////////////////////////////////////// // // SOCKADDR TCPFORMATADRESS ///////////////////////////////////////////////////////////////////////////// // // DESCRIPTION // --sockaddr TcpFormatAdress-- // ARGUMENTS // Argument1: char * host // Argument2: u_short port // RETOUR/RESULTAT // static struct // REMARQUE // Rev 11/12/2003 ////////////////////////////////////////////////////////////////////////////// static struct sockaddr TcpFormatAdress( char * host, u_short port ) { struct sockaddr_in addr; struct sockaddr addrRet; struct hostent FAR *lphost ; u_long IP; memset((char*)&addr, 0, sizeof(addr)); /* Soit on fournit une adresse IP, soit on fournit un nom */ if ((IP = inet_addr(host)) == (u_long)INADDR_NONE) { if ((lphost = gethostbyname(host))==NULL) { memset( (char * )&addrRet, 0, sizeof(addrRet) ); return addrRet; } addr.sin_family = lphost->h_addrtype; #ifdef _WIN16 /* A définir dans le projet WIN16 */ _fmemcpy (&addr.sin_addr, lphost->h_addr, lphost->h_length); #else /* WIN32, UNIX*/ memcpy (&addr.sin_addr, lphost->h_addr, lphost->h_length); #endif } else { addr.sin_family = AF_INET; addr.sin_addr.s_addr = IP; } /* Port destination */ addr.sin_port = htons((u_short)port ); memcpy( (char *)&addrRet, (char *)&addr, sizeof(addrRet) ); return addrRet; } ///////////////////////////////////////////////////////////////////////////// // // MAIN ///////////////////////////////////////////////////////////////////////////// // // DESCRIPTION // --main-- // ARGUMENTS // Argument1: int argc // Argument2: char ** argv // RETOUR/RESULTAT // int // REMARQUE // Rev 11/12/2003 ////////////////////////////////////////////////////////////////////////////// int main( int argc, char ** argv ) { SOCKET hSocket; struct sockaddr_in addr; int len = sizeof(addr); struct sockaddr addrConnect; char * pszProxyHost; int nProxyPort; char * pszServerHost; int nServerPort; char szQuery[2000]; int cbQuery; char szBuffer[20000]; int cbBuffer = sizeof(szBuffer) - 1; int cbRecv; char * pszUrl; int hCreat; #ifdef _WIN32 WSADATA stack_info ; WSAStartup(MAKEWORD(2,0), &stack_info) ; #endif /* Parsing des donnees */ if( argc != 6 ) { printf( "Usage : %s \n" ); return -1; } pszProxyHost = argv[1]; nProxyPort = ( atoi(argv[2]) == 0 ? 80 : atoi(argv[2]) ); pszServerHost = argv[3]; nServerPort = ( atoi(argv[4]) == 0 ? 80 : atoi(argv[4]) ); pszUrl = argv[5]; /* socket TCP */ hSocket = socket( PF_INET, SOCK_STREAM, 0 ); if( hSocket == INVALID_SOCKET ) { printf( "socket() error (%d)\n", SOCKET_ERRNO ); return -1; } /* Liaison avec le port porLocal */ addr.sin_family = AF_INET ; addr.sin_addr.s_addr = htonl (INADDR_ANY); addr.sin_port = htons ((unsigned short)0 ); if ( bind( hSocket, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR ) { printf( "socket() error (%d)\n", SOCKET_ERRNO ); return -1; } /* Soit on fournit une adresse IP, soit on fournit un nom */ addrConnect = TcpFormatAdress( pszProxyHost, (u_short)nProxyPort ); /* Mode bloquant */ if( connect( hSocket, &addrConnect, sizeof(addrConnect) ) == SOCKET_ERROR ) { printf( "connect() error (%d)\n", SOCKET_ERRNO ); return -1; } /* Construction et envoi de la requette */ cbQuery = sprintf( szQuery, "GET %s HTTP/1.0\r\n" "Host: %s:%d\r\n" "Connection: Close\r\n" "\r\n", pszUrl, pszServerHost, nServerPort ); if( send( hSocket, szQuery, cbQuery, 0 ) == SOCKET_ERROR ) { printf( "send() error (%d)\n", SOCKET_ERRNO ); return -1; } /* On met tout ds un fichier */ hCreat = creat( "recv.txt", 644 ); if( hCreat == -1 ) { printf( "open() error %d\n", errno ); return -1; } #ifdef _WIN32 setmode( hCreat, O_BINARY ); #endif while( (cbRecv = recv( hSocket, szBuffer, cbBuffer, 0)) > 0 ) { // Affichage ds la console write( 1, szBuffer, cbRecv ); // Ecriture du fichier write( hCreat, szBuffer, cbRecv ); } close( hCreat ); /* fin */ closesocket( hSocket ); return 0; }