информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяГде водятся OGRыЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Спасибо, с InternetOpenURL у меня тоже заработало. Но мне... 23.09.09 05:26  Число просмотров: 4700
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка>
Спасибо, с InternetOpenURL у меня тоже заработало. Но мне нужно ещё и данные POST передавать. InternetOpenUrl позволяет делать это? Если нет, то мне надо надеть носки на комбинацию InternetConnect/HttpOpenRequest/HttpSendRequest. Пока этого мне сделать не удалось (возвращается пустой ответ сервера), причём что с вашим IP, что и с моим (соксовым), который реально работает.
	HINTERNET hInternet = InternetOpen("OpaOpa", INTERNET_OPEN_TYPE_PROXY, "socks=127.0.0.1:1080", NULL, 0);
	HINTERNET hConnect =  InternetConnect(hInternet, "leader.ru", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
	HINTERNET hRequest = HttpOpenRequest(hConnect, "GET", "secure/who.html", NULL, NULL, 0, INTERNET_FLAG_KEEP_CONNECTION, 1);
	HttpSendRequest(hRequest, NULL, 0, NULL, 0);

	InternetReadCompleteFile(hRequest, (LPBYTE) szBuf, 100000);

---

Функция InternetReadCompleteFile - моя собственная, которая построена на базе InternetReadFile (она рабочая 100%).

Может быть нужно поиграться с константами INTERNET_DEFAULT_HTTP_PORT и INTERNET_SERVICE_HTTP? Я пробовал их менять на другие, но результата это не дало.
<programming>
Дубль 2. как общаться с socks-прокси через библиотеку wininet? 22.09.09 14:18  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка>
Опять преждевременно закрыл тему :((.
То решение, о котором я говорил в прошлой теме (приписать socks4= к IP адресу) оказывается не работает. Я сейчас попробовал приписать туда "jkls2=" и соединение к моему большому удивлению было установлено! Оказывается функция InternetOpen игнорирует строку с прокси, если она задана не коректно. Также она себя повела и с предыдущей строкой ("socks4="), а я по своей наивности подумал, что действительно соединение через прокси прошло.

Так как же всё-таки мне выходить в интернет через сокс прокси?
Спасибо всем откликнувшимся! Я разобрался со своей проблемой... 26.09.09 10:00  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
Отредактировано 26.09.09 10:49  Количество правок: 5
<"чистая" ссылка>
Спасибо всем откликнувшимся! Я разобрался со своей проблемой на приемлемом уровне. Всё заработало. Только мне стало интересно, есть ли библиотеки для работы с Интернет, которые работают быстрее, чем Wininet.

В сети нашёл библиотеку libcurl, о которой прочитал в двух местах (ссылки ниже). Переписал свою программу под неё, и оказалось, что она существенно быстрее WinInet. Если WinInet загружала мой трафик на 25-30% и грузила процессор на 100%, то с libcurl моя программа стала загружать трафик на 40-45% и грузить процессор на 80%.

Но вот проблема... Почему-то тот вариант библиотеки, который я скачал (версия 7.19.6, ссылка на неё внутри текста первой статьи + SDK для MSVC версия 7.15., ссылка внутри второй статьи), умеет работать только с SOCKS5. Когда я говорю ей работать с SOCKS4 (задаю CURLOPT_PROXYTYPE значение CURLPROXY_SOCKS4), то, при попытке загрузить страницу, библиотека ругается: "unknown proxytype option given". С SOCKS5 всё работает.

Но! Хоть с SOCKS5 всё и работает, но библиотека продолжает возвращать ошибки (видимо, не критические, поэтому и работает дальше). Вопрос: если я соединяюсь с четвёртыми соксами с использованием опции CURLPROXY_SOCKS5, то может ли это быть причиной ошибок?

Чем вообще SOCKS4 от SOCKS5 отличается, кроме того, что последний требует авторизации?

В интернет по-профессиональному
Работаем в сети с помощью libcurl
Документация на libcurl
У меня на интернет канале в 2 мегабит wininet работает когда я не вижу что проц грузит хотя бы на 10%, причём функции дёргаются из-под виртуальной смоллток-машины ;) 27.09.09 19:03  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 27.09.09 19:04  Количество правок: 1
<"чистая" ссылка>
Ты чего там, по байтам чтоли инфу принимаешь-отсылаешь? ;)
Код, что плохо работал с вининетом, можно "в студию"?
У меня тоже виртуалка стоит. У тебя 2 мегабита полностью загружаются? Я параллельно 1000 потоков запускаю. 27.09.09 19:30  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка>
А, ну тогда ясно... У меня всего 1 поток @#$ачит :) 27.09.09 22:50  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
Ух, заработало! Помог такой рецепт: dll-ки от библиотеки 7.19.6, а SDK от 7.19.3. Кто-нибудь знает, такое враварство случайно боком ни где не вылезет в будущем? 26.09.09 11:42  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка>
Ну, изначально приписывать версию протокола это ошибка (как... 22.09.09 17:30  
Автор: kstati <Евгений Борисов> Статус: Elderman
<"чистая" ссылка>
Ну, изначально приписывать версию протокола это ошибка (как это было сделано в прошлом "решении").
схема описания прокси проще:
[<protocol>=][<scheme>://]<proxy>[:<port>]
то есть, например так:
HTTP=HTTP://proxyserver:port
FTP=FTP://proxyserver:port
GOPHER=HTTP://proxyserver:port
SOCKS=proxyserver:port

Socks4 отличается от socks5 только тем, что возможна авторизация.
Проверить работу с socks5 временно не могу, поэтому толькопредполагаю что проблема решается соответствующими опциями:
InternetSetOption() -> INTERNET_OPTION_PROXY_USERNAME, INTERNET_OPTION_PROXY_PASSWORD

> Опять преждевременно закрыл тему :((.
> То решение, о котором я говорил в прошлой теме (приписать
> socks4= к IP адресу) оказывается не работает. Я сейчас
> попробовал приписать туда "jkls2=" и соединение к моему
> большому удивлению было установлено! Оказывается функция
> InternetOpen игнорирует строку с прокси, если она задана не
> коректно. Также она себя повела и с предыдущей строкой
> ("socks4="), а я по своей наивности подумал, что
> действительно соединение через прокси прошло.
>
> Так как же всё-таки мне выходить в интернет через сокс
> прокси?
И ещё один вопрос в догонку. 22.09.09 17:53  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка>
После вызова InternetOpen идёт вызов InternetConnect. В последней, в числе прочего есть параметр INTERNET_PORT nServerPort, который может принимать (в том числе) такие значения:
INTERNET_DEFAULT_HTTP_PORT
INTERNET_DEFAULT_SOCKS_PORT

Так вот он вопрос: нужно ли здесь тоже ставить "соксовую" константу, или нужно оставить http-шную?
Ты чего такой несамостоятельный? -)) 23.09.09 08:49  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 23.09.09 09:01  Количество правок: 1
<"чистая" ссылка>
Залазь на MSDN и не вылазь оттуда, пока всё не заработает! -))
Вот тебе рабочий пример работы с вининетом.
Правда, метод используется PUT, и прокси не юзает. Но так всё похоже.
Извини за языг программирования, но разобраться можно, я надеюсь -))
AnyStoredFiles>>copyFile: filePath to: serverName url: anUrlString
	| inetLib hInternet |
	
	inetLib := WinInetLibrary default.

	"Получаем хендл для тырнета"
	hInternet :=inetLib 
				internetOpen: SessionManager current applicationShortName
				accessType: INTERNET_OPEN_TYPE_PRECONFIG
				proxyName: nil
				proxyByPass: nil
				flags: 0.
	hInternet isNull ifTrue: [^Win32Error signal].

[hConnect |
	"Подключаемся к серверу"
	hConnect := inetLib 
				internetConnect: hInternet 
				serverName: serverName
				serverPort: INTERNET_INVALID_PORT_NUMBER "Это порт по умолчанию"
				userName: 'HandleX' "Это я для потомков ;-)"
				password: 'none'
				service: INTERNET_SERVICE_HTTP
				flags: 0 context: 0.
	hConnect isNull ifTrue: [Win32Error signal].

	[hRequest |
		"Подготавливаем к использованию метод HTTP->PUT"
		hRequest := inetLib 
				httpOpenRequest: hConnect
				verb: 'PUT'
				"Наименование объекта — серверная папка + имя файла"
				objectName: (
					anUrlString last == $/ 
						ifTrue:[anUrlString, (File splitFilenameFrom: filePath)] 
						ifFalse: [anUrlString, '/', (File splitFilenameFrom: filePath)]
				)
				version: nil
				"Указываем реферрера — какой класс объекта вызвал этот метод, может пригодится когда-нибудь"
				referrer: self name
				acceptTypes: nil
				flags: 0 context: nil.
		hRequest isNull ifTrue: [Win32Error signal].

		[buff buffSize hFile fSize bytesWritten inetBuff |
			"Открываем файл, создаём все нужные буферы"
			buff := ByteArray newFixed: (buffSize := 2048).
			hFile := FileStream read: filePath text: false.
			fSize := hFile size.
			bytesWritten := DWORD new.

			"Отправляем запрос с указанием размера файла"
			inetBuff := INTERNET_BUFFERS new.
			inetBuff dwBufferTotal: fSize.
			(inetLib 
				httpSendRequestEx: hRequest
				buffersIn: inetBuff
				buffersOut: nil
				flags: HSR_INITIATE context: nil) ifFalse: [Win32Error signal].

			[hFile atEnd] whileFalse: 
			[bytesRead |
				"Отправляем файл блоками, равными размеру буфера или меньше, если остаток меньше буфера"
				bytesRead := (hFile position + buffSize > fSize) ifFalse: [buffSize] ifTrue: [fSize - hFile position].
				hFile next: bytesRead into: buff startingAt: 1.
				(inetLib 
					internetWriteFile: hRequest
					buffer: buff yourAddress
					numberOfBytesToWrite: bytesRead
					numberOfBytesWritten: bytesWritten) ifFalse: [Win32Error signal]].
			hFile close.

			(inetLib httpEndRequest: hRequest buffersOut: nil flags: 0 context: nil) ifFalse: [Win32Error signal]
	"Закрываем все используемые хендлы"
			] ensure: [inetLib internetCloseHandle: hRequest]
		] ensure: [inetLib internetCloseHandle: hConnect]
	] ensure: [inetLib internetCloseHandle: hInternet]

---
Так вот в том-то всё и дело, что без прокси всё работает, а с прокси не хочет. из msdn'а и так не вылажу, но он информацией по поводу socks-proxy особо не балует 23.09.09 09:06  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
Отредактировано 23.09.09 09:09  Количество правок: 1
<"чистая" ссылка>
В InternetConnect уже ничего не должно быть проксячего, всё делает InternetOpen, если вернутсья к твоему вопросу ;) 23.09.09 10:07  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 23.09.09 10:30  Количество правок: 1
<"чистая" ссылка>
Данную схему я тоже уже в MSDN видел. Комбинация "socks="... 22.09.09 17:50  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка>
Данную схему я тоже уже в MSDN видел. Комбинация "socks=" была у меня первой. Авторизация на моём прокси не требуется (он к IP привязан). Например, в Fire Fox я прописываю только адрес и порт. Моя же программа не хочет работать.

Ещё я в MSDN вычитал, что socks поддерживается библиотекой WinInet только в том случае, если socsks поддерживается Internet Explorer'ом. И ещё там говорится, что если Internet Explorer поддерживает socks, то в системе должна присутствовать библиотека Wsock32n.dll.

SOCKS в Internet Explorer у меня работает, а вот библиотеки такой нету, как это понимать?
[win32] работающий пример socks4 внутри, а с пятым - сам в ступоре: error_internet_incorrect_handle_type 22.09.09 19:09  
Автор: kstati <Евгений Борисов> Статус: Elderman
Отредактировано 22.09.09 19:13  Количество правок: 4
<"чистая" ссылка>
Код нормально работает с 4-м соксом
hInternet = InternetOpen("UserAgent", INTERNET_OPEN_TYPE_PROXY, "socks=127.0.0.1:1080", NULL, 0);
hURL = InternetOpenUrl(hInternet, "http://google.com/",NULL, NULL, NULL, NULL);
result =  InternetReadFile(hURL, &buffer, sizeof(buffer)-1, &bytesReaded);
cout << "result "<< result << endl << bytesReaded << "bytes readed "  << buffer << endl;

---
Но если после InternetOpen.. добавить пару строк типа
result = InternetSetOption(hInternet,INTERNET_OPTION_PROXY_USERNAME,user,sizeof(user));
if (!result) cout << "Error #"<<  GetLastError() << endl; 

---

вывалится сообщение об ошибке #12018, которая является константой ERROR_INTERNET_INCORRECT_HANDLE_TYPE -- The type of handle supplied is incorrect for this operation.

Резюме:
Носки 4-го размера, устанавливаются InternetOpen("UserAgent", INTERNET_OPEN_TYPE_PROXY, "socks=address:port",...);
Носки пятого размера надеть я не смог. Предполагаю, что IE не совместим с ними, хотя это только предположение.

> Данную схему я тоже уже в MSDN видел. Комбинация "socks="
> была у меня первой. Авторизация на моём прокси не требуется
> (он к IP привязан). Например, в Fire Fox я прописываю
> только адрес и порт. Моя же программа не хочет работать.
>
> Ещё я в MSDN вычитал, что socks поддерживается библиотекой
> WinInet только в том случае, если socsks поддерживается
> Internet Explorer'ом. И ещё там говорится, что если
> Internet Explorer поддерживает socks, то в системе должна
> присутствовать библиотека Wsock32n.dll.
>
> SOCKS в Internet Explorer у меня работает, а вот библиотеки
> такой нету, как это понимать?
Спасибо, с InternetOpenURL у меня тоже заработало. Но мне... 23.09.09 05:26  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка>
Спасибо, с InternetOpenURL у меня тоже заработало. Но мне нужно ещё и данные POST передавать. InternetOpenUrl позволяет делать это? Если нет, то мне надо надеть носки на комбинацию InternetConnect/HttpOpenRequest/HttpSendRequest. Пока этого мне сделать не удалось (возвращается пустой ответ сервера), причём что с вашим IP, что и с моим (соксовым), который реально работает.
	HINTERNET hInternet = InternetOpen("OpaOpa", INTERNET_OPEN_TYPE_PROXY, "socks=127.0.0.1:1080", NULL, 0);
	HINTERNET hConnect =  InternetConnect(hInternet, "leader.ru", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
	HINTERNET hRequest = HttpOpenRequest(hConnect, "GET", "secure/who.html", NULL, NULL, 0, INTERNET_FLAG_KEEP_CONNECTION, 1);
	HttpSendRequest(hRequest, NULL, 0, NULL, 0);

	InternetReadCompleteFile(hRequest, (LPBYTE) szBuf, 100000);

---

Функция InternetReadCompleteFile - моя собственная, которая построена на базе InternetReadFile (она рабочая 100%).

Может быть нужно поиграться с константами INTERNET_DEFAULT_HTTP_PORT и INTERNET_SERVICE_HTTP? Я пробовал их менять на другие, но результата это не дало.
Кстати, только сейчас заметил: здесь функция HttpOpenRequest... 23.09.09 09:09  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка>
Кстати, только сейчас заметил: здесь функция HttpOpenRequest возвращает ошибку 122 (Область данных, переданная по системному вызову, слишком мала.).

О чём она? Ведь я ей буферы не передаю никакие!
Ты не забыл, что последний параметр httpopenrequest... имеет тип dword_ptr ? 23.09.09 13:51  
Автор: kstati <Евгений Борисов> Статус: Elderman
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach