Показать сообщение отдельно

  #8  
Старый 27.06.2007, 06:44
KEZ
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме:
1941233

Репутация: 2726


По умолчанию

Цитата:
создал сокет, отправляю запрос 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);
*** ты из файла, в котором встречаются нулевые байты, запишешь таким образом данные

Цитата:
char page_text[50000];
угу, а потом return page_text ... да, все-таки некоторым больше подойдет делфи

Цитата:
char p[50000];
lstrcpy(file,GETRequest("izobilnik.ru","/yourfile.zip"));
ну а тут вообще без комментариев

Цитата:
2 [NiGHT]DarkAngel Ты из соката через recv читай сначала данные во временный буфер. КОгда уже пройдут все HTTP заголовки. то потом начинай читать и сразу писать в файл.
Гениальный совет кодера. Не даром у тебя написано "asm+delphi". Нахер спрашивается читать сначала в буффер, выделяя -неизвестное- кол-во памяти, а потом в файл, если можно сразу пропустить заголовки и в файл?

PS
кез спит, сейчас разбужу, забыла какая есть ф-ия ещё API там... а. всмысле это нерд пишет) приветик)

Последний раз редактировалось KEZ; 27.06.2007 в 06:49..