Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python代理脚本有一些问题_Python_Multithreading_Sockets_Proxy - Fatal编程技术网

python代理脚本有一些问题

python代理脚本有一些问题,python,multithreading,sockets,proxy,Python,Multithreading,Sockets,Proxy,我尝试在不同的脚本中使用异步IO和线程库。但线程将在高速连接中导致此错误: filedescriptor out of range in select() 导致此错误的源代码: try: reader, _, _ = select.select([socket_src, socket_dst], [], [], 1) except select.error as err: error("Select failed", err) 我试图增加fd限制,但无法修复此错误 在异步IO

我尝试在不同的脚本中使用异步IO和线程库。但线程将在高速连接中导致此错误:

filedescriptor out of range in select()
导致此错误的源代码:

try:
    reader, _, _ = select.select([socket_src, socket_dst], [], [], 1)
except select.error as err:
    error("Select failed", err)
我试图增加fd限制,但无法修复此错误

在异步IO库中:

  • 运行脚本后,一切正常

  • 运行脚本20分钟后,用户将在发送请求约1分钟后连接到代理

  • 任何用户在1小时后都无法连接到代理

  • 我的消息来源:

    import socket
    import asyncio
    import aiosocks
    from struct import pack, unpack
    
    
    class Client(asyncio.Protocol):
        def connection_made(self, transport):
        self.transport = transport
        self.server_transport = None
    
        def data_received(self, data):
        # print('recv:', repr(data))
        self.server_transport.write(data)
    
        def connection_lost(self, *args):
        self.server_transport.close()
    
    
    class Server(asyncio.Protocol):
        INIT, HOST, DATA = 0, 1, 2
    
        def connection_made(self, transport):
        print('from:', transport.get_extra_info('peername'))
        self.transport = transport
        self.state = self.INIT
    
        def connection_lost(self, exc):
        self.transport.close()
    
        def data_received(self, data):
        # print('send:', repr(data))
    
        if self.state == self.INIT:
            assert data[0] == 0x05
            self.transport.write(pack('!BB', 0x05, 0x00))  # no auth
            self.state = self.HOST
    
        elif self.state == self.HOST:
            ver, cmd, rsv, atype = data[:4]
            assert ver == 0x05 and cmd == 0x01
    
            if atype == 3:    # domain
                length = data[4]
                hostname, nxt = data[5:5+length],  5+length
            elif atype == 1:  # ipv4
                hostname, nxt = socket.inet_ntop(socket.AF_INET, data[4:8]), 8
            elif atype == 4:  # ipv6
                hostname, nxt = socket.inet_ntop(socket.AF_INET6, data[4:20]), 20
            port = unpack('!H', data[nxt:nxt+2])[0]
    
            print('to:', hostname, port)
            asyncio.ensure_future(self.connect(hostname, port))
            self.state = self.DATA
    
        elif self.state == self.DATA:
            self.client_transport.write(data)
    
        async def connect(self, hostname, port):
        loop = asyncio.get_event_loop()
        socks5_addr = aiosocks.Socks5Addr('127.0.0.1', 1080)
        dst = (hostname, port)
        transport, client = await aiosocks.create_connection(Client, proxy=socks5_addr, proxy_auth=None, dst=dst)
        client.server_transport = self.transport
        self.client_transport = transport
        hostip, port = transport.get_extra_info('sockname')
        host = unpack("!I", socket.inet_aton(hostip))[0]
        self.transport.write(
            pack('!BBBBIH', 0x05, 0x00, 0x00, 0x01, host, port))
    
    if __name__ == '__main__':
        loop = asyncio.get_event_loop()
        srv = loop.create_server(Server, 'localhost', 8000)
        loop.run_until_complete(srv)
        loop.run_forever()
    
    我应该怎么做才能解决至少一个问题

    如果你知道其他图书馆,请告诉我

    谢谢