ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Закрытая тема
 
Опции темы Поиск в этой теме Опции просмотра

Сокет и получение данных
  #1  
Старый 23.06.2007, 22:47
[NiGHT]DarkAngel
Участник форума
Регистрация: 29.03.2005
Сообщений: 138
Провел на форуме:
812087

Репутация: 129
По умолчанию Сокет и получение данных

Народ,я решил попробывать свои силы и сделать качалку фаилов )) , создал сокет, отправляю запрос http серверу на получение фаила,теперь вопрос е подскажите,где можно почитать про получение данных из сокета и сохрание на диске,как убрать из сокета ответ http сервера? Пишу на С++

Зарание благодарен

ЗЫ ногами сильно не бить,я только учусь ))

Последний раз редактировалось [NiGHT]DarkAngel; 23.06.2007 в 22:58..
 

  #2  
Старый 23.06.2007, 22:54
GoreMaster
Участник форума
Регистрация: 28.05.2007
Сообщений: 125
Провел на форуме:
638513

Репутация: 103
По умолчанию

Цитата:
ответ http сервера?
.data
file db "C:\test.exe",0
url db "your_host/file",0
.code
invoke URLDownloadToFile, NULL,ADDR url ,ADDR file ,0,NULL
в wininet.dll функция
http://www.wasm.ru/article.php?article=socketvssocket
З.Ы.:на каком языке пишешь?

Последний раз редактировалось GoreMaster; 23.06.2007 в 23:24..
 

  #3  
Старый 23.06.2007, 23:18
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

2 GoreMaster Он укзал что пишет на С++. Твой пример хорошь, но на нем него нельзя нацепить прогрессбар

2 [NiGHT]DarkAngel Ты из соката через recv читай сначала данные во временный буфер. КОгда уже пройдут все HTTP заголовки. то потом начинай читать и сразу писать в файл.

Последний раз редактировалось slesh; 23.06.2007 в 23:22..
 

  #4  
Старый 24.06.2007, 06:19
NetMan
Участник форума
Регистрация: 09.02.2004
Сообщений: 122
Провел на форуме:
1089794

Репутация: 134
По умолчанию

 

  #5  
Старый 24.06.2007, 12:30
je0n
Постоянный
Регистрация: 14.05.2006
Сообщений: 334
Провел на форуме:
1543521

Репутация: 272
Отправить сообщение для je0n с помощью ICQ
По умолчанию

http://forum.web-hack.ru/index.php?showtopic=6328

Тебе еще потребуются знание http-протокола. Юзай гугл. Вкратце: сначала посылаешь GET-запрос, затем получаешь в цикле через recv получаешь инфу. Что-то вроде этого:
Код:
char buf_in[10];
int x;
char page_text[50000];    //тут будет храниться все, что получаешь

	x=recv(sock,buf_in,sizeof(buf_in)-1,0);
	while(x>0)	
	{
		buf_in[x]=0;
		lstrcat(page_text,buf_in);
//		printf(buf_in);
		x=recv(sock,buf_in,sizeof(buf_in)-1,0);
	}
Ну и еще пример функции. Я писал ее, чисто чтобы получать код страницы, а не файла. Но суть-то одна и таже. Ты и файл ей получишь.

Код:
char* GETRequest(char* server,char* page)
{
	WSADATA sock_info;
	int err=WSAStartup(MAKEWORD(2,0),&sock_info);
	if(err==SOCKET_ERROR)
	{
		printf("WSAStartup error");
		return 0;
	}
	int sock;
	struct sockaddr_in sa;
	struct hostent* h;
	char page_text[50000];
	char buf_in[10];
	char buf_out[500];
	int x;
	sa.sin_family=AF_INET;
	sa.sin_port=htons(80);
	h=gethostbyname(server);
	memcpy(&sa.sin_addr,h->h_addr_list[0],h->h_length);
	sock=socket(AF_INET,SOCK_STREAM,0);
	if(connect(sock,(sockaddr*)&sa,sizeof(sa))<0)
	{
		printf("connect() error");
		return 0;
	}
	lstrcpy(buf_out,"GET ");                  //Составляем GET-запрос
	lstrcat(buf_out,page);
	lstrcat(buf_out," HTTP/1.0\r\n");
	send(sock,buf_out,lstrlen(buf_out),0);
	lstrcpy(buf_out,"Host: izobilnik.ru\r\n");
	send(sock,buf_out,lstrlen(buf_out),0);
	lstrcpy(buf_out,"Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, */*\r\n");
	send(sock,buf_out,lstrlen(buf_out),0);
	lstrcpy(buf_out,"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)\r\n\r\n"); //заголовок User-Agent:
	send(sock,buf_out,lstrlen(buf_out),0);
	lstrcpy(page_text,"");
	x=recv(sock,buf_in,sizeof(buf_in)-1,0);
	while(x>0)
	{
		buf_in[x]=0;
		lstrcat(page_text,buf_in);
//		printf(buf_in);
		x=recv(sock,buf_in,sizeof(buf_in)-1,0);
	}
	closesocket(sock);
	return page_text;
}
пример использования:
Код:
char p[50000];
lstrcpy(file,GETRequest("izobilnik.ru","/yourfile.zip"));
по идее в p, должен быть ответ от сервера, вместе с файлом. Если файл большой, то увеличь значение в 50000

Последний раз редактировалось je0n; 24.06.2007 в 12:34..
 

  #6  
Старый 24.06.2007, 13:23
[NiGHT]DarkAngel
Участник форума
Регистрация: 29.03.2005
Сообщений: 138
Провел на форуме:
812087

Репутация: 129
По умолчанию

всем спасибо,завтро сдам экзамен и буду пробывать )
 

  #7  
Старый 26.06.2007, 21:46
[NiGHT]DarkAngel
Участник форума
Регистрация: 29.03.2005
Сообщений: 138
Провел на форуме:
812087

Репутация: 129
По умолчанию

Так я научился получать данные и псиать в фаил )) , подскажите плз еще немножко,как убрать из фаила ответ Http-сервера ?или где почитать ))

Зарание благодарен
 

  #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..
 

  #9  
Старый 27.06.2007, 07:41
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

Цитата:
Сообщение от [NiGHT]DarkAngel  
Так я научился получать данные и псиать в фаил )) , подскажите плз еще немножко,как убрать из фаила ответ Http-сервера ?или где почитать ))

Зарание благодарен
Если у тебя с алгоритмикой все в порядке, должен догадаться (RFC почитать что-ли, ну или хз), что данные отделяются от заголовка последовательностью \r\n\r\n
Ищи эти 4 байта в ответе сервера.

ЗЫ. это если протокол 1.0. У протокола 1.1 там свои выкрутасы еще есть.

Цитата:
Сообщение от KEZ  
на*** сохранять в файл ответ сервера? получаешь ответ, пока не встретятся \r\n два раза. затем читаешь в буффер скажем по 5кб данных и сохраняешь в файл. если надо эстетичнее - находи Content-Length: X и считывай X после переносов.
Ну.. для протокола хттп 1.0 достаточно просто сохранять тупо всё, пока сокет не закроют на сервере.
Для протокола 1.1 - там передается отдельно длина запроса, и после передачи всего тела сокет не закрывается, так что если этого не учесть, твоя прога повиснет, когда получит все данные, и отвиснет только после разрыва соединения по тайм-ауту

Последний раз редактировалось _Great_; 27.06.2007 в 07:48..
 

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

Репутация: 2726


По умолчанию

Цитата:
Ну.. для протокола хттп 1.0 достаточно просто сохранять тупо всё, пока сокет не закроют на сервере.
Для протокола 1.1 - там передается отдельно длина запроса, и после передачи всего тела сокет не закрывается, так что если этого не учесть, твоя прога повиснет, когда получит все данные, и отвиснет только после разрыва соединения по тайм-ауту
ну это ясно, только мы пишем в заголовке HTTP/1.0 и все путем)

Последний раз редактировалось _Great_; 27.06.2007 в 09:21..
 
Закрытая тема



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ответьте на вопросы Legion342 PHP, PERL, MySQL, JavaScript 5 22.11.2007 14:03
Посимвольный перебор в базах данных на примере MySQL LoFFi Чужие Статьи 5 30.04.2007 05:05
Перехват данных BрxMSG Чужие Статьи 0 26.12.2006 22:22
Перехват данных, кто, где и как? GreenBear Чужие Статьи 1 16.12.2006 16:43
Защищаем MySql. Шаг за шагом k00p3r Чужие Статьи 0 13.06.2005 11:18



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ