Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | |
Так вот в том-то всё и дело, что без прокси всё работает, а с прокси не хочет. из msdn'а и так не вылажу, но он информацией по поводу socks-proxy особо не балует 23.09.09 09:06 Число просмотров: 3440
Автор: Vedrus <Serokhvostov Anton> Статус: Member Отредактировано 23.09.09 09:09 Количество правок: 1
|
|
<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
|
|
|
|