Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проста программа поддержки туннеля через сокеты(урезанный HTTP proxy) / 4 сообщений из 4, страница 1 из 1
24.02.2007, 05:48
    #34352588
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проста программа поддержки туннеля через сокеты(урезанный HTTP proxy)
Задача:
Есть приложение, которое пытается установить через прокси сервер туннель, отправляя запросы типа
Код: plaintext
1.
CONNECT vir1b.toonel.net: 8081  HTTP/ 1 . 1 
Кроме запросов "CONNECT" оно никаких других запросов больше никогда не отправляет.
Запрос выглядит именно так, как указано в цитате, без дополнительных строк. (только меняется комбинация адрес:порт)
Максимум она создает 8 туннелей одновременно.
Если я правильно понял, туннель работает через Ssl. (я в этом не уверен)

Требуется:
Написать простое C++ приложение(консольное), которое через сокеты будет
перехватывать запрос на коннект, менять его на
Код: plaintext
1.
CONNECT https://dub1.toonel.net/ HTTP/ 1 . 1 
отправлять его на другой прокси
а затем поддерживать туннель.
Приложение будет потом перенесно на линукс, так что .NET и MFC использовать не выйдет. (потребуется переносить многопоточность, но это решаемо, так как смог портировать alphaProxy под вин32, есть образец...)

Проблема:
Я приблизительно представляю, как написать приложение, которое будет работать как урезанный прокси-сервер перебрасывая запросы между клиентом и сервером, но у меня нет образца кода работы с туннелями. (alpha proxy это не поддерживает)

Как должен выглядеть код работы с туннелем (т.е. двухсторонний переброс данных)? С прокси-сервером понятно, так как можно считать запрос, обработать его, и переслать серверу, получить от него ответ, обработать, и переслать клиенту (т.е. прием/передача идет попеременно). Но, как я понял из rfc2616, формат данных, передаваемых через toonel неизвестен/может быть любым, соответственно, мне пока неясно, как поддерживать общение между клиентом/сервером (оно ведь может быть двухсторонним/одновременным, без пауз?)...
...
Рейтинг: 0 / 0
24.02.2007, 05:50
    #34352589
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проста программа поддержки туннеля через сокеты(урезанный HTTP proxy)
Забыл уточнить. Запрос должен переправлятся на HTTP прокси.
Вопрос связан вот с этой темой.
...
Рейтинг: 0 / 0
24.02.2007, 17:09
    #34352885
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проста программа поддержки туннеля через сокеты(урезанный HTTP proxy)
как я понимаю, обработка туннеля должна выглядеть приблизительно так (dstSock и srcSock - это концы туннеля, проходящего через приложение):
Код: 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.
	while (true){
		char tmp[ 4096 ];

		int srcsize = recv(srcSock, tmp, sizeof(tmp),  0 );
		if (srcsize == SOCKET_ERROR)
			if (WSAGetLastError() != WSAECONNRESET)
				break;
		if (srcsize ==  0 )
			break;
		
		send(destSock, tmp, srcsize,  0 );
		int destsize = recv(destSock, tmp, sizeof(tmp),  0 );
		if (destsize == SOCKET_ERROR)
			if (WSAGetLastError() != WSAECONNRESET)
				break;
		if (destsize ==  0 )
			break;

		printf("client: %.4d bytes; server: %.4d bytes        \r", srcsize, destsize);
		send(srcSock, tmp, destsize,  0 );
	}

	printf("\n");

	shutdown(destSock, SD_BOTH);
	closesocket(destSock);
	shutdown(srcSock, SD_BOTH);
	closesocket(srcSock);
Проблема в том, что, когда клиенту "сказать больше нечего", цикл виснет не recv, так как соединение не разрывается. Как это можно вылечить?
...
Рейтинг: 0 / 0
24.02.2007, 18:50
    #34352980
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проста программа поддержки туннеля через сокеты(урезанный HTTP proxy)
Разобрался.
Пустил прием и передачу данных в два отдельных параллельных потока(thread). Все заработало, вопрос закрыт.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проста программа поддержки туннеля через сокеты(урезанный HTTP proxy) / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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