| 
 
 
 
 Легенда:
  новое сообщение 
  закрытая нитка 
  новое сообщение 
  в закрытой нитке 
  старое сообщение   | 
Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
Новичкам также крайне полезно ознакомиться с данным документом.
|  | Ну, изначально приписывать версию протокола это ошибка (как...  22.09.09 17:30  Число просмотров: 3821 Автор: 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="), а я по своей наивности подумал, что
 > действительно соединение через прокси прошло.
 >
 > Так как же всё-таки мне выходить в интернет через сокс
 > прокси?
 |  | <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
 |  
|  |  
 
 
 |  |