Python套接字代理示例,不断收到调用bind()的错误..为什么?

时间:2011-07-22 09:10:06

标签: python linux sockets proxy network-programming

我正在编写一个从fifo文件中获取命令的ad-hoc代理,然后使用python套接字和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部分。但这也没有区别:(

BTW ..使用Arch Linux

1 个答案:

答案 0 :(得分:0)

嗯....如果我在pull_sock.connect位之后和绑定之前声明了push_sock可变 ,它就不再发生了?!这几乎就像Python中的一个错误让两个套接字混淆了吗?

现在似乎可以实现梦想了!