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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Ты не забыл, что последний параметр httpopenrequest... имеет тип dword_ptr ? 23.09.09 13:51  Число просмотров: 3270
Автор: kstati <Евгений Борисов> Статус: Elderman
<"чистая" ссылка>
<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