Что нового

[Сеть, интернет] TCPRecv и TCPSend. Пример простого прокси

zoxer1

Знающий
Сообщения
72
Репутация
6
Добрый день!

нашел в интернете скрипты простого прокси, и ни один из них не работает. Поэтому хотел разобраться сам но ничего не получилось а именно

Код:
#include <Array.au3>
TCPStartup()

;Variables
Global $client_recv = "", $server_recv = ""
Global $RecvMode = 1
Global $client_socket = -1 

;Port: 8080 - you can change if you want
$MainSocket = TCPListen("127.0.0.1", 8888)
If @error Then MsgBox(16, "Error", "1")
ConsoleWrite(@CR & "Server started...")

Do
    $client_socket = TCPAccept($MainSocket)
Until $client_socket > -1
ConsoleWrite(@CR & "Browser connected." & @CRLF)

While 1
	if $RecvMode = 1 Then
		$client_recv = TCPRecv($client_socket, 1024 * 100)	
		If $client_recv <> "" Then
			ConsoleWrite($client_recv & @CRLF)		
			$server_socket = TCPConnect("127.0.0.1", 8080)		
			If @error Then MsgBox(16, "Error2", @error)
			TCPSend($server_socket, $client_recv)
			ConsoleWrite(@CR & "Send: " & StringLen($client_recv) & " bytes.")
			$RecvMode = 0
			
			
		EndIf
	EndIf
	If $RecvMode = 0 Then
		Do
			$server_recv = TCPRecv($server_socket, 1000000)
		Until $server_recv <> ""
			
		If $server_recv <> "" Then
			ConsoleWrite($server_recv & @CRLF)	
			ConsoleWrite(@CR & "Server Recv: " & StringLen($server_recv) & " bytes")
			TCPSend($client_socket, $server_recv)
			$RecvMode = 1
		EndIf
	EndIf

		
WEnd


Запрос с браузера идет на AutoIt проски (127.0.0.1:8888), перенаправляется на Локальный прокси (127.0.0.1:8080). Ответ с локального прокси приходит, но не отправляется на клиент (браузер) можете что подсказать? браузер виснет - статус загрузки страницы останавливается. :scratch:
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
Код:
Do
            $server_recv = TCPRecv($server_socket, 1000000)
        Until $server_recv <> ""

я канешно пока ещё не очень хорошо разбераюсь, но ты уверен что прокси сразу отвечает полным файлом?
Мне кажется что сначала должны идти кокето доп данные а потом сама страница.


Добавлено:
Сообщение автоматически объединено:

Щас опробовал с некоторыми изменения, в общем нужно много соединений сразу чтобы поддерживал.
У меня покрайней мере в опере грузится страница до первого файла вставки...
 
Автор
Z

zoxer1

Знающий
Сообщения
72
Репутация
6
хм... над этим задумывался но в консоли пишется (с помощью этого я смотрел)
Код:
ConsoleWrite($server_recv & @CRLF)


как будто бы все данные принял. т.е. в конце текста вижу такие строки
Код:
<img src="http://rs.mail.ru/d523187.gif" alt="" />
	</div>
<!-- CDN: '' -->
<!-- RB_REGION: [28] -->
</body>
</html>

думаю это и есть конец принимаемых данных...

В еще ворос:
Код:
$server_recv = TCPRecv($server_socket, 1000000)

означает ли что если данных больше, чем 1000000 байт, то при следующем вызове функции произодет принятие следующих 1000000 байт?

Дополнение:
страница открылась, но на это подтребовалось ооочень много времени и страница без картинок. С чем может быть связано?
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
Код:
TCPStartup()

Global $client_recv = "", $server_recv = ""
Global $RecvMode = 1
Global $client_socket = -1 


$MainSocket = TCPListen("127.0.0.1", 8888)
If @error Then MsgBox(16, "Error", "1")
ConsoleWrite(@CR & "Server started...")

Do
    $client_socket = TCPAccept($MainSocket)
Until $client_socket <> -1
ConsoleWrite(@CR & "Browser connected." & @CRLF)

$server_socket = TCPConnect('141.105.65.70', 80)      
If @error Then MsgBox(16, "Error2", @error)

While 1
	$client_recv = TCPRecv($client_socket, 1024 * 100)  
	If $client_recv <> "" Then
		ConsoleWrite($client_recv & @CRLF)      
		TCPSend($server_socket, $client_recv)
		ConsoleWrite(@CR & "Server Send: " & StringLen($client_recv) & " bytes.")
	EndIf
	$server_recv = TCPRecv($server_socket, 1024 * 100)
	If $server_recv <> "" Then
		ConsoleWrite($server_recv & @CRLF)  
		ConsoleWrite(@CR & "Server Recv: " & StringLen($server_recv) & " bytes")
		TCPSend($client_socket, $server_recv)
	EndIf  
WEnd

Вот такой пробовал
 
Автор
Z

zoxer1

Знающий
Сообщения
72
Репутация
6
сейчас попробовал открывается, но тоже ооочень долго и тоже без картинок. Прогресс застревает где-то на половине загрузки страницы... :scratch:
 

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
Это из-за того, что скрипт работает в один поток, и не закрывает соединения, после принятие и возврата данных

Второе правится небольшим изменением кода
А вот над первым надо попариться, можно держать несколько соединений и перебирать их, например
 
Автор
Z

zoxer1

Знающий
Сообщения
72
Репутация
6
нашел на англоязычном форуме реализацию прокси, там все данные заносятся в массив и циклом перебираются все соединения, но это все очень медленно работает.

и теперь созрел такой вопрос: Можно ли на AutoIt'е написать хороший прокси (без тормазов), чтоб работал с 1им клиентом и максимум 3 окнами браузера?
 

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
Нет, т.к. AutoIT однопоточен

Можно уже существующие решения подогнать под твои нужны (наверно)
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
BIOS [?]
Нет, т.к. AutoIT однопоточен
Ну не совсем... можно оргонизовать многосокетность.


Добавлено:
Сообщение автоматически объединено:

zoxer1 [?]
нашел на англоязычном форуме реализацию прокси, там все данные заносятся в массив и циклом перебираются все соединения, но это все очень медленно работает.
и теперь созрел такой вопрос: Можно ли на AutoIt'е написать хороший прокси (без тормазов), чтоб работал с 1им клиентом и максимум 3 окнами браузера?
Только тагже как ты и описал, то можно правельно выбрав нужное количество подключений хорошо его ускорить.
 

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
winstan [?]
Ну не совсем... можно оргонизовать многосокетность.
Я это уже упоминал:
BIOS [?]
можно держать несколько соединений и перебирать их, например

Но мне возразили
zoxer1 [?]
но это все очень медленно работает.
 
Верх