Пример прокси сокета Python, продолжаю получать ошибки, вызывая bind () .. почему? - PullRequest
0 голосов
/ 22 июля 2011

Я пишу специальный прокси-сервер, который принимает команды из файла fifo, затем размещает произвольные прокси-соединения с использованием python socket и select.poll. Моя проблема заключается в том, что очень часто при вызове socket.bind я получаюлибо ошибка «Неверный дескриптор файла», либо «Операция с сокетом без сокета», и я не знаю, почему?Вот фрагмент кода:

pull_sock=socket.socket()
push_sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
pull_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
push_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
clients={}
# start pull connection
try:
    print "connecting to:", saddr, sport
    pull_sock.connect((saddr,sport))
    except Exception, e:
        print "unable to connect:", repr(e)
        self._threadsafe_remove_dport(dport)
        return
    # start push server connection
    try:
        sleep(1)
        push_sock.bind(('',dport))
        push_sock.listen(1)
        print "host new proxy on %d to %s:%d" % (dport, saddr, sport)
        print "pushfd=",push_sock.fileno(),"pullfd=",pull_sock.fileno()
        # register sockets for async polling
        sockpoll = select.poll()
        sockpoll.register(push_sock, select.POLLIN | select.POLLOUT)
        sockpoll.register(pull_sock, select.POLLIN)

Это команда bind(), которая всегда терпит неудачу, ничего больше.Я пробовал '' (все сетевые карты), '127.0.0.1', 'localhost' ... все делают то же самое.

Я также закомментировал часть REUSEADDR.но это тоже не имело значения: (

Кстати ... используя Arch Linux

1 Ответ

0 голосов
/ 22 июля 2011

Хммм .... Если я объявлю push_sock переменным после pull_sock.connect битов и непосредственно перед привязкой, это больше не произойдет ?! Это похоже на ошибку в Python, которая приводит к путанице в двух сокетах?

Похоже, сейчас работает мечта!

...