Использование прокси и нескольких сокетов в Python - PullRequest
0 голосов
/ 21 декабря 2018

Я пишу прокси с tcp-соединением, которое прослушивает несколько портов от клиента и перенаправляет его на сервер.

Проблема в том, что программное обеспечение зависает на sock.accept.

Может быть, я здесь делаю грязную логику, но мне нужен клиент, который подключается к ПК, и этот компьютер подключается к другому устройству.Итак, я написал этот маленький прокси, и я получаю INVALID ARGUMENT ERROR в socket.accept ()

import select
import socket
import threading

class Proxy(object):

    def __init__(self, ip, ports):
        self._ip = ip
        self._sockets = []
        self._proxy = {}

        for port in ports:
            self._proxy[port] = self.add_socket(port)

    def add_socket(self, port=None):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        if port:
            # sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
            sock.bind(('0.0.0.0',port))
        self._sockets.append(sock)
        return sock

    def get_client(self, src_sock, src_addr):
        src_ip, src_port = src_addr
        _, dst_port = src_sock.getsockname()

        if src_ip == self._ip:
            # got packet from device
            dst_addr = ("10.8.8.210", dst_port)
        else:
            # got packet from client
            dst_addr = self._ip, dst_port
            print(">", src_port, dst_addr)
        dst_sock = self._proxy[src_port]
        return dst_sock, dst_addr

    def run(self):
        while True:
            read_list, _, _ = select.select(self._sockets, [], [])

            if read_list:
                for sock in read_list:
                    try:

                        conn, addr = sock.accept()
                        data  = conn.recvfrom(16*2024)
                        # print("got data from {} {}".format(sock, addr))
                        dst_sock, dst_addr = self.get_client(sock, addr)
                       # print("forwarding data from {} to {}".format(addr, dst_addr, len(data)))
                        dst_sock.sendto(data, dst_addr)
                    except:
                        raise # pass # print("no recipient for data")
        for s in self._sockets:
             s.close()

ports = [30001,30002,30003, 30070, 30071,30072,30075]
p = Proxy("192.168.2.10", ports)                    
p.run()

1 Ответ

0 голосов
/ 21 декабря 2018

Вы должны позвонить listen на сокете до accept:

, добавив sock.listen(1) к add_socket после bind

 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 sock.bind(('0.0.0.0', port))
 sock.listen(1)
 self._sockets.append(sock)

, после чего вы сможете позвонитьпринять без ошибки.Возможно, вы захотите установить большее число невыполненных запросов на прослушивание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...