Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 14, 2013 03:43:11

skavans
Зарегистрирован: 2012-11-13
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

SOCKS прокси-сервер на сокетах

Понадобился не совсем обычный прокси-сервер, в качестве тренировки (а также ввиду отсутствия готовых решений с необходимым функционалом) решил написать его сам, питон отлично мне подходит для этой задачи. Нашел несколько исходников, были и совсем простые, буквально в 200 строк. С хэндшейком разобрался, проблем не возникает. Но вот никак не могу понять, как правильно действовать после.. Сейчас имеется вот такой код:

def forward(src, dest):
    try:
        data = src.recv(10)
        while data:
            dest.sendall(data)
            data = src.recv(10)
    except:
        src.close()
        dest.close()
while True:
    insock, addr_info = sock.accept()
    print 'start proxy session with client', addr_info[0]
    
    # ... handshake
    # ... получение ip и port
    # ... коннект к ip:port -> outsock
    Thread(target=forward, args=(insock, outsock)).start()
    Thread(target=forward, args=(outsock, insock)).start()
То есть запускается два потока, которые обмениваются данными. Вопрос в том, как грамотно отследить, что данные закончились? В голову пришло только ставить таймаут socket.settimeout(), к примеру, 5 секунд, ловить socket.error и закрывать соединения. Но это ведь бред - так можно и полтора часа ждать загрузки сайта, пока прокси отработает соединения со всеми хостами… Может быть, как-то можно по-другому отследить окончание обмена данными? С сокетами просто не работал никогда, не очень хорошо прошарил, что к чему

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version