python у скрипта прокси есть проблемы - PullRequest
1 голос
/ 07 марта 2020

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

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, но это не исправило эту ошибку.

и в библиотеке asyncio:

  1. после запуска скрипта все в порядке.

  2. через 20 минут работы скрипта пользователи подключатся через 1 минуту после отправки запроса

  3. и любой пользователь не может подключиться к прокси через 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()

что я должен сделать, чтобы решить хотя бы одну из этих проблем?

если вы знаете какие-либо другие библиотеки, пожалуйста, скажите мне.

спасибо

...