⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gethttp.c

📁 md5加密算法
💻 C
📖 第 1 页 / 共 2 页
字号:
    strcpy(Request, Verb);		//request    strcat(Request, " ");		//url    strcat(Request, URL);    strcat(Request, " ");    strcat(Request, Headers1);	memset ( tailBuffer, (char)0, 3*1024);#ifdef UNIX	snprintf( tailBuffer, 3* 1024,"Host: %s%s",Server, portBuffer);#else	_snprintf( tailBuffer, 3* 1024,"Host: %s%s",Server, portBuffer);#endif    strcat(Request, tailBuffer);    if (ClientDataSize)     {        sprintf(ClientData, "Content-Length: %d\r\n", ClientDataSize);        strcat(Request, ClientData);    }    if ( fKeepAlive )    {        strcat(Request, "Connection: Keep-Alive\r\n" );    }	    strcat(Request, Headers2);	    strcat(Request, CrLf);	    RequestSize = strlen(Request);	printf(" request\n<%s>\n",Request);		//send request data    Error = send(		Socket,		Request,		RequestSize,		0);	    if (Error != RequestSize)     {        printf("Error in client send = %d, %s\n", Error, strerror(errno));        fSt = FALSE;        goto ex;    }	    if (ClientDataSize)     {        memset( ClientData, ' ', ClientDataSize );		        //        // Send the client data        //		        Error =			send(            Socket,            ClientData,            ClientDataSize,            0);		        if ( Error != ClientDataSize)         {            printf("Error in client send = %d, %s\n", Error, strerror(errno));            fSt = FALSE;            goto ex;        }    }		    cLen = (int)-1;    fInHeader = TRUE;    fServerKeepAlive = FALSE;		// parse status & header    for ( pH = ReceiveBuffer, fStatusLine = TRUE ; fInHeader ; )    {        cRec = recv( Socket, pH, ReceiveBuffer+sizeof(ReceiveBuffer)-pH, 0 );        if ( cRec <= 0 )        {            close( Socket );            Socket = INVALID_SOCKET;            break;        }        pH[ cRec ] = '\0';				// Iterate on header fields		        while ( pN = strstr(pH, "\r\n" ) )        {            *pN = '\0';						printf( "pH<%s>\n", pH );			            if ( fStatusLine )            {                // This is the status line, decode status				                SkipNonWhite( &pH );                SkipWhite( &pH );                Status = atoi( pH );                if ( Status == 401 )                {					//                    fNeedAuthenticate = TRUE;                }                fStatusLine = FALSE;            }			            else if ( pN == pH )    // end of header fields            {                memtofile( fp, pH+2, strlen( pH+2) ); // put the data to file								if ( cLen != -1 )				{					cLen -= ( strlen( pH+2) ); // count the rest data length				}                fInHeader = FALSE;                break;            }			#ifdef UNIX            else if ( !strncasecmp( pH, HD_LENGTH, sizeof(HD_LENGTH)-1 ) )#else				else if ( !_strnicmp( pH, HD_LENGTH, sizeof(HD_LENGTH)-1 ) )#endif            {                // get content length                SkipNonWhite( &pH );                SkipWhite( &pH );                cLen = atoi( pH );				printf("cLen : %d\n", cLen );            }#ifdef UNIX            else if ( !strncasecmp( pH, HD_CONNECTION, sizeof(HD_CONNECTION)-1 ) )#else				else if ( !_strnicmp( pH, HD_CONNECTION, sizeof(HD_CONNECTION)-1 ) )#endif            {                // check for keep-alive flag				                SkipNonWhite( &pH );                SkipWhite( &pH );#ifdef UNIX                if ( !strncasecmp( pH, "Keep-Alive", sizeof("Keep-Alive")-1 ) )#else					if ( !_strnicmp( pH, "Keep-Alive", sizeof("Keep-Alive")-1 ) )#endif						fServerKeepAlive = TRUE;            }#ifdef UNIX            else if ( !strncasecmp( pH, TRANSFER_ENCODE, sizeof(TRANSFER_ENCODE)-1 ) )#else				else if ( !_strnicmp( pH, TRANSFER_ENCODE, sizeof(TRANSFER_ENCODE)-1 ) )#endif            {                SkipNonWhite( &pH );                SkipWhite( &pH );#ifdef UNIX                if ( !strncasecmp( pH, "chunked", sizeof("chunked")-1 ) )#else					if ( !_strnicmp( pH, "chunked", sizeof("chunked")-1 ) )#endif						fGetChunkLen = FALSE;            }#ifdef UNIX            else if ( !strncasecmp( pH, ENTITY_TAG, sizeof(ENTITY_TAG)-1 ) )#else				else if ( !_strnicmp( pH, ENTITY_TAG, sizeof(ENTITY_TAG)-1 ) )#endif            {                SkipNonWhite( &pH );                SkipWhite( &pH );				memset( etagbuffer, (char)0, 256 );				printf(" etag: |%s|\n", pH);				if ( etagflag == 0 )					etagflag = 1;				strncpy( etagbuffer, pH, 256);            }#ifdef UNIX            else if ( !strncasecmp( pH, "Last-Modified", sizeof("Last-Modified")-1 ) )#else				else if ( !_strnicmp( pH, "Last-Modified", sizeof("Last-Modified")-1 ) )#endif            {                SkipNonWhite( &pH );                SkipWhite( &pH );				memset( modifybuffer, (char)0, 256 );				printf(" moddify: |%s|\n", pH);				if ( modifyflag == 0 )					modifyflag = 1;				strncpy( modifybuffer, pH, 256);            }			            pH = pN + 2;        }    }		printf(" rest data cLen : %d\n", cLen );	    // read message body	    if ( Socket != INVALID_SOCKET )    {		int		ChunkState =0; // 0: init, 1: , 2: , 3: ,        for ( ;  ; )         {						printf(" brfore read execute  Length : %d\n", cLen );			memset (  ReceiveBuffer, (char )0, sizeof(ReceiveBuffer));						cToRead = sizeof(ReceiveBuffer);			if ( fGetChunkLen == TRUE )			{				if ( (cToRead  > cLen ) && ( cLen != -1 ))					cToRead = cLen;			}            cRec = recv( Socket, ReceiveBuffer, cToRead, 0 );			printf("len %d, buffer:<%s>",cRec, ReceiveBuffer);            if ( cRec <= 0 )            {                close( Socket );                Socket = INVALID_SOCKET;                break;            }			//find chunked length			if ( fGetChunkLen == FALSE )			{				pH = ReceiveBuffer;								for ( ; cRec > 0; )				{					sscanf( pH,"%x", &chunkedLen); // get chunkedLen data length					if ( chunkedLen== 0 )						break;										pN = strstr(pH, "\r\n" ); // get rid of \r\n					if( pN == NULL )					{						break;					}					pH = pN + 2; // get rid of \r\n					cRec -=( pH - ReceiveBuffer); // get rid of chunkedLen buffer 					printf(" crec %d, chnked %d\n", cRec, chunkedLen);										{						if ( cRec < chunkedLen ) // buffer length < chuncked length						{							memtofile( fp, pH, cRec ); // write to file							chunkedLen -= cRec;     // get rest chuncked length							cRec =0;				// set flag to restart							pH += cRec;				// move the pointer						}						else						// buffer length >= chunked length						{							memtofile( fp, pH, chunkedLen );	// write to file							pH += chunkedLen;				//move the pointer							cRec -= (chunkedLen +2);		//left length 							chunkedLen = 0;					//set flag							if ( cRec == 0 )				// data process over?							{								cRec = recv( Socket, ReceiveBuffer, cToRead, 0 );	//receive another package								printf("len %d, buffer:<%s>",cRec, ReceiveBuffer);								if ( cRec <= 0 )			// end of the package								{									close( Socket );									Socket = INVALID_SOCKET;									cRec = 0;									break;								}								pH = ReceiveBuffer;							}						}					}					printf("over write crec %d, chnked %d\n", cRec, chunkedLen);				}				if( Socket == INVALID_SOCKET )				{					break;				}				for ( ; chunkedLen > 0 ; ) // buffer length < chunked length 				{					if ( cToRead > chunkedLen )					{						cToRead = chunkedLen;					}					cRec = recv( Socket, pH, cToRead, 0 );					printf("<%s>",pH);					if ( cRec <= 0 )					{						close( Socket );						Socket = INVALID_SOCKET;						break;					}										memtofile( fp, pH, cRec );										chunkedLen -= cRec;					if ( chunkedLen <= 0 )					{						break ;					}				}							}			else			{				memtofile( fp, pH, cRec );			}			if( Socket == INVALID_SOCKET )			{				break;			}			if ( fGetChunkLen == TRUE )			{				cLen -= cRec;				if ( cLen <= 0 )				{					close( Socket );					Socket = INVALID_SOCKET;					break;				}			}        }    }	    if ( !fServerKeepAlive )    {        close( Socket );        Socket = INVALID_SOCKET;    }	    fSt = Status == 200;	printf( "Status =%d\n", Status);	ex:	printf(" return %d \n", fSt );	    if ( Socket != INVALID_SOCKET )        close(Socket);			printf(" <%s> \n", ReceiveBuffer);	if ( fp != NULL ) 	{		fprintf( fp, "%s\n", ReceiveBuffer );		fclose( fp );	}    return fSt;}// Helper functionsvoid SkipWhite(char **ppS ){    char *pS = *ppS;	    while ( *pS && isspace(*pS) )        ++pS;	    *ppS = pS;}void SkipNonWhite(char **ppS ){    char *pS = *ppS;	    while ( *pS && !isspace(*pS) )        ++pS;	    *ppS = pS;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -