Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / скачка страницы через proxy/WinSock / 10 сообщений из 10, страница 1 из 1
30.01.2007, 13:46
    #34292726
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
скачка страницы через proxy/WinSock
Здравствуйте!
Есть небольшая функция, которая считывает стартовую страничку с опр. адреса. Хотелось бы её изменить так, чтобы она использовала proxy-сервер. Подскажите, пожлауйста, линк на ресурс, где можно почитать про взаимодействие с прокси. Гуглом стабильно на рекламу выкидывает...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
//...
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET){
	printf("error at socket()\n");
	WSACleanup();
	return - 1 ;
}

hostent* host =  0 ;
host = gethostbyname(servername);
if (!host){
	printf("gethostbyname() failed");
	return - 1 ;
}

sockaddr_in clientData;
memset(&clientData,  0 , sizeof(clientData));
clientData.sin_family = AF_INET;
clientData.sin_port = htons( 80 );// 80 ;
clientData.sin_addr.S_un.S_un_b.s_b1 = host->h_addr[ 0 ];
clientData.sin_addr.S_un.S_un_b.s_b2 = host->h_addr[ 1 ];
clientData.sin_addr.S_un.S_un_b.s_b3 = host->h_addr[ 2 ];
clientData.sin_addr.S_un.S_un_b.s_b4 = host->h_addr[ 3 ];

printf("connecting to %d.%d.%d.%d\n", 
	clientData.sin_addr.S_un.S_un_b.s_b1, 
	clientData.sin_addr.S_un.S_un_b.s_b2, 
	clientData.sin_addr.S_un.S_un_b.s_b3, 
	clientData.sin_addr.S_un.S_un_b.s_b4
);

if (connect(sock, (SOCKADDR*)&clientData, sizeof(clientData)) == SOCKET_ERROR){
	printf ("Failed to connect\n");
	WSACleanup();
	return  0 ;
};

static char request[ 1000000 ];
static char answer[ 1000000 ];
memset(answer,  0 , sizeof(answer));
sprintf(request, "GET /\n  HTTP/1.1\nHost: %s\n\n", hostname);

if (send(sock, request, (int)strlen(request),  0 ) == SOCKET_ERROR){
	printf("send() failed\n");
	WSACleanup();
	return  0 ;
}

int recievedBytes = SOCKET_ERROR;
while (recievedBytes = SOCKET_ERROR){
	recievedBytes = recv(sock, answer, sizeof(answer),  0 );
	if (recievedBytes ==  0 || recievedBytes == WSAECONNRESET){
		break;
	}
	if (recievedBytes <  0 ){
		printf("error!\n");
		WSACleanup();
		return  0 ;
	}
}
//...
...
Рейтинг: 0 / 0
30.01.2007, 15:58
    #34293403
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
скачка страницы через proxy/WinSock
Смотря какой прокси... В случае с HTTP - все так же, только урл - полный (http://www.и т.д) + возможно понадобитится поле Host в запросе. Socks прокси - сложнее. У него протокол двоичный.
...
Рейтинг: 0 / 0
30.01.2007, 19:05
    #34294116
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
скачка страницы через proxy/WinSock
Dimitry SibiryakovСмотря какой прокси... В случае с HTTP - все так же, только урл - полный (http://www.и т.д) + возможно понадобитится поле Host в запросе. Socks прокси - сложнее. У него протокол двоичный.
Вообще прокси HTTP. Просто нужен линк, где расписаны протоколы/способы общения с прокси.
...
Рейтинг: 0 / 0
30.01.2007, 19:15
    #34294138
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
скачка страницы через proxy/WinSock
Просто способ "общения" с прокси-сервером наверняка задокументирована, проблем в том, что документацию я пока не нашел...
...
Рейтинг: 0 / 0
30.01.2007, 21:11
    #34294312
SnowMan2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
скачка страницы через proxy/WinSock
Несколько лет незад я тоже столкнулся с такой проблемой и нашел 3 пути ее разрешения:

1. Установить на компьютер, где запускается данная программа ProxyClient. При этом в программе ничего не надо менять. ProxyClient настраивается с учетом ProxyServer-a перехватывает TCP пакеты в Интернет, что-то там меняет и посылает на ProxyServer, который благополучно отправляет дальше. Ответ обратным путем. Недостаток: надо инсталировать и настраивать на каздом компьютере. У меня их оказалось много и я от этой идеи отказался. К сожалению ProxyClient не сохранился, и ссылка тоже. Надо поиском.

2. Изменить посылаемый пакет самому. Не сильно большое изменение. Только сделал как администратор сменил прокси и пославил с авторизацией и у меня все полетело. Так, что этот путь тоже не перспективен.

3. Перейти на другой набор фукций: InternetOpen, InternetConnect, HttpOpenRequest, HttpSendRequest и т.д. Функции описаны в MSDN. Переделка капитальная, зато работает через все типы прокси, и без прокси и по всякому. Один раз повозился, зато теперь не знаю проблем.
...
Рейтинг: 0 / 0
30.01.2007, 21:47
    #34294373
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
скачка страницы через proxy/WinSock
SnowMan2Несколько лет незад я тоже столкнулся с такой проблемой и нашел 3 пути ее разрешения:

Меня больше интересует разобраться с взаимодействием с прокси самому - т.е. без установки доп софта/использования InternetConnect - т.е. интересует работа на низком уровне, через сокеты (даже если и с авторизацией). Проблема в том, что я пока ничего по этому поводу не нашел. (что вообще-то довольно странно... :-\)

Попробую глянуть *nix'совский код...
...
Рейтинг: 0 / 0
30.01.2007, 22:02
    #34294396
SnowMan2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
скачка страницы через proxy/WinSock
Надо посылать на порт пркси сервера типа:

Код: plaintext
1.
2.
3.
4.
5.
GET http://www.proba.ru/имя_файла/ HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */*
Accept-Language: ru
User-Agent: Mozilla/ 2 . 0  (compatible; MSIE  3 . 01 ; Windows  95 )
Host: www.proba.ru
Proxy-Connection: Keep-Alive

С авторизацицией не разобрался, там нужно посылать какие-то длинные строки типа:
Код: plaintext
Proxy-Authenticate: NTLM TlRMTVNTUAACAAAAFAAUADAAAAAFggEAago5JVORYmcAAAAAAAAAAAAAAABEAAAATgBFAFQAQwBPAE4AVABSAE8ATAA=
По которым прокси сервер проверяет имя пользователя и пароль.
ИМХО: данный путь самый бесперспективный.
...
Рейтинг: 0 / 0
30.01.2007, 22:55
    #34294448
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
скачка страницы через proxy/WinSock
SnowMan2Надо посылать на порт пркси сервера типа:
...

Спасибо! Теперь хотя бы знаю ключевые слова для поиска...
...
Рейтинг: 0 / 0
30.01.2007, 23:06
    #34294459
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
скачка страницы через proxy/WinSock
Разобрался, вроде бы. Формат запросов для работы с прокси, как я понял, описан в RFC 2616. (http://ru.wikipedia.org/wiki/HTTP, http://tools.ietf.org/html/rfc2616, http://www.w3.org/Protocols/HTTP/1.1/rfc2616.pdf)

Всем спасибо.
...
Рейтинг: 0 / 0
31.01.2007, 10:49
    #34295178
Funt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
скачка страницы через proxy/WinSock
Сам долго мучался с прокси.
В общем случае это ничем не отличается от прямого доступа, только, как здесь уже было сказано, сокет должен соединяться с портом прокси. И дальше GET, POST и т.п.
Другое дело, когда прокси требует авторизации.
У себя реализовал два типа Basic (совсем просто - шлется один доп. заголовок со значением Имя:Пароль, закдированными в Base64) и NTLM - алгоритм можно поискать в сети. Там авторизация происходит в несколько итераций.
Очень рекомендую обратить внимание на проект cURL, его лицензия позволяет использовать в коммерческих разработках. Прилинкуешь либу + dll-ка на 200 к - в результате прокси со всеми типами авторизации и простой API
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / скачка страницы через proxy/WinSock / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]