Uso de la función API de WinInet InternetWriteFile bajo el protocolo http
BOOL InternetWriteFile(
EN HINTERNET hFile,
EN LPCVOID lpBuffer,
EN DWORD dwNumberOfBytesToWrite,
OUT LPDWORD lpdwNumberOfBytesWritten
);
hFile
Identificador válido devuelto por una llamada anterior a FtpOpenFile o un identificador de HINTERNET enviado por HttpSendRequestEx
Dirección de un buffer que contiene los datos a escribir en el archivo
dwNumberOfBytesToWrite
Número de bytes a escribir en el archivo
p>
p>
lpdwNumberOfBytesWritten
Dirección de una variable que recibe el número de bytes escritos en el búfer InternetWriteFile establece este valor en cero antes de realizar cualquier trabajo o verificación de errores.
Dé un ejemplo:
#include
#include
#include
BOOL UseHttpSendReqEx(HINTERNET hRequest, DWORD dwPostSize);
#define BUFFSIZE 500
void main( int argc, char **argv )
{
DWORD dwPostSize;
if (argc < 4)
{
printf("Uso: Bigpost
printf("
printf("
printf("
exit(0);
}
if ( ((dwPostSize = strtoul(argv[1],NULL,10)) == 0) || (dwPostSize >=) )
{
printf("%s
El tamaño no es válido. Los tamaños válidos son del 1 al 2047999\n",[1]);
exit(0);
}
printf( ". Prueba de publicación %luKB con WinInet\n", dwPostSize);
dwPostSize *= 1024; // Convertir KB a bytes
HINTERNET hSession = InternetOpen( "HttpSendRequestEx",,
NULL, NULL, 0);
if(!hSession)
{
printf("Error al abrir la sesión\n" );
exit(0);
}
HINTERNET hConnect = InternetConnect(hSession, argv[2],,
NULL , NULL, INTERNET_SERVICE_HTTP,NULL, NULL);
if (!hConnect)
printf( "Error al conectar\n" );
else p> p>
{
HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", argv[3],
NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0);
if (!hRequest)
printf( "Error al abrir el identificador de solicitud\n" );
else
{
if(UseHttpSendReqEx(hRequest, dwPostSize))
{
char pcBuffer[BUFFSIZE];
DWORD dwBytesRead;
printf ("\nEl servidor devolvió lo siguiente:\n");
do
{ dwBytesRead=0;
if(InternetReadFile(hRequest , pcBuffer , BUFFSIZE-1,&dwBytesRead))
{
pcBuffer[dwBytesRead]=0x00 // Búfer de terminación nula
printf("%;
s", pcBuffer);
}
else
printf("\nInternetReadFile falló");
} while(dwBytesRead> 0);
printf("\n");
}
if (!InternetCloseHandle(hRequest))
printf( "Error al cerrar el identificador de solicitud\n" );
}
if(!InternetCloseHandle(hConnect))
printf("Error al cerrar el identificador de conexión\ n");
}
if( InternetCloseHandle( hSession ) == FALSE )
printf( "Error al cerrar el identificador de sesión\n" );
printf( "\nFinished.\n" );
}
BOOL UseHttpSendReqEx(HINTERNET hRequest, DWORD dwPostSize)
{
INTERNET_BUFFERS BufferIn;
DWORD dwBytesWritten;
int n;
BYTE pBuffer[1024];
BOOL bRet;
BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS ); // Debe configurarse o se producirá un error
BufferIn.Next = NULL;
BufferIn.lpcszHeader = NULL;
BufferIn.dwHeadersLength = 0;
BufferIn.dwHeadersTotal = 0;
BufferIn.lpvBuffer = NULL;
BufferIn .dwBufferLength = 0;
BufferIn.dwBufferTotal = dwPostSize; // Este es el único miembro utilizado además de dwStructSize
BufferIn.dwOffsetLow = 0;
BufferIn .dwOffsetHigh = 0;
if(!HttpSendRequestEx( hRequest, &BufferIn, NULL, 0, 0))
{
printf( "Error en HttpSen
dRequestEx %d\n",GetLastError() );
return FALSE;
}
FillMemory(pBuffer, 1024, 'D'); // Llenar el buffer con datos
bRet=TRUE;
for(n=1; n<=(int)dwPostSize/1024 && bRet; n++)
{
if(bRet=InternetWriteFile( hRequest, pBuffer, 1024, &dwBytesWritten))
printf( "\r%d bytes enviados.", n*1024);
}
if(!bRet)
{
printf( "\nError en InternetWriteFile %lu\n",GetLastError() );
return FALSE;
}
if(!HttpEndRequest(hRequest, NULL, 0, 0))
{
printf( "Error en HttpEndRequest %lu \n", GetLastError());
devuelve FALSO;
}
devuelve VERDADERO; p> p>
}