создал сокет, отправляю запрос http серверу на получение фаила,теперь вопрос е подскажите,где можно почитать про получение данных из сокета и сохрание на диске,как убрать из сокета ответ http сервера? Пишу на С++
получение данных из сокета - recv() и recvfrom(), тебе нужна первая
сохранение на диске - запиши в файл. например CreateFile(), WriteFile(), CloseHandle()
убрать ответ сервера - обреж все до двух \r\n подряд и дальше сохраняй.
как я понимаю ты сначала записываешь в файл все, что вернул сервер. если да то пошли с нами долбаться и гонять по вене. на*** сохранять в файл ответ сервера? получаешь ответ, пока не встретятся \r\n два раза. затем читаешь в буффер скажем по 5кб данных и сохраняешь в файл. если надо эстетичнее - находи Content-Length: X и считывай X после переносов. если ещё эстетичнее - InternetOpen(), HttpOpenRequest(), HttpSendRequest() и так далее. например из illusion
Код:
DWORD Download( LPSTR server, LPSTR path, LPSTR local )
{
HINTERNET hInternet = _InternetOpen( TEXT("Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.5a) Gecko/20030728 Mozilla Firebird/0.6.1"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 );
if (!hInternet)
return 5;
HINTERNET hConnect =
_InternetConnect(
hInternet,
TEXT( server ),
INTERNET_DEFAULT_HTTP_PORT,
NULL, NULL, INTERNET_SERVICE_HTTP, 0, (LPDWORD)1u );
if (!hConnect)
return 6;
HINTERNET hRequest = _HttpOpenRequest( hConnect, TEXT( "GET" ), TEXT( path ), NULL, NULL, 0, INTERNET_FLAG_KEEP_CONNECTION, (LPDWORD)1 );
if (!hRequest)
return 7;
BOOL bSend = _HttpSendRequest( hRequest, NULL, NULL, NULL, NULL );
if (!bSend) return 8;
/* delete old file */
_DeleteFile( local );
/* create new */
HANDLE hFile = _CreateFile( local, GENERIC_WRITE, NULL, NULL, CREATE_NEW, NULL, NULL );
if (hFile == INVALID_HANDLE_VALUE) return 9;
DWORD dwBytesRead, dwBytesWrite;
BYTE szData[1024];
BYTE ret = 0;
for (;;)
{
if (!Opt_HTTP_Download.started)
{
ret = 1;
break;
}
BOOL bRead = _InternetReadFile( hRequest, szData, sizeof( szData ) - 1, &dwBytesRead );
Opt_HTTP_Download.filesize += 1024; //dwBytesRead;
if (!bRead || !dwBytesRead) break;
szData[dwBytesRead] = 0;
if (!_WriteFile( hFile, szData, dwBytesRead, &dwBytesWrite, NULL )
|| !dwBytesWrite) break;
}
_CloseHandle( hFile );
_InternetCloseHandle( hRequest );
_InternetCloseHandle( hConnect );
_InternetCloseHandle( hInternet );
if (ret) return 255; else return 1;
}
_funcname заменяй на funcname
всякие if (!Opt_HTTP_Download.started) уберай
je0n, пиздец ты друг накатал ***ни)
может будет по байту запрос составлять и отсылать по байту?
так нельзя?
sprintf( request, "GET %s HTTP/1.1\r\nHost: %s\r\n\r\n", path, host );
send( s, request, strlen( request ), 0 );
lstrcat(page_text,buf_in);
*** ты из файла, в котором встречаются нулевые байты, запишешь таким образом данные
угу, а потом
return page_text ... да, все-таки некоторым больше подойдет делфи
char p[50000];
lstrcpy(file,GETRequest("izobilnik.ru","/yourfile.zip"));
ну а тут вообще без комментариев
2 [NiGHT]DarkAngel Ты из соката через recv читай сначала данные во временный буфер. КОгда уже пройдут все HTTP заголовки. то потом начинай читать и сразу писать в файл.
Гениальный совет кодера. Не даром у тебя написано "asm+delphi". Нахер спрашивается читать сначала в буффер, выделяя -неизвестное- кол-во памяти, а потом в файл, если можно сразу пропустить заголовки и в файл?
PS
кез спит, сейчас разбужу, забыла какая есть ф-ия ещё API там... а. всмысле это нерд пишет) приветик)