【问题标题】:Bind to open port in specific range绑定到特定范围内的开放端口
【发布时间】:2017-04-18 17:54:56
【问题描述】:

我想绑定一个套接字来监听一定范围内的任何开放端口。通常我绑定到零,操作系统很适合给我一个随机的开放端口。但是现在我需要保持在某个范围内,例如防火墙指定的4000-5000。在这个范围内如何向操作系统请求开放端口?

我在 Python 中执行此操作。我对跨平台解决方案感兴趣,但会满足于特定于 Linux 的解决方案。

【问题讨论】:

    标签: python sockets networking port


    【解决方案1】:

    我曾经为了完全相同的目的写了一小段代码

    # SWAMI KARUPPASWAMI THUNNAI
    import socket
    
    class Ports:
        """
        This class is ued to find all the open ports present
        """
        __upper_bound = 0
        __lower_bound = 0
        __ip = "127.0.0.1" # change your i.p if it is not your machine IP
        __ports = [] # our actively available ports
        # used to set upper and lower bounds i.e the range of the ports to be scanned
        def __init__(self,initial,final):
            self.__lower_bound=initial
            self.__upper_bound=final
    
        # a method which scans for the range of ports
        def scan_for_ports(self):
            for i in range(self.__lower_bound,self.__upper_bound):
                print("[SCANNING]: "+str(i))
                check = self.is_port_opened(i)
                if check == 0:
                    self.__ports.append(i) # append our opened port no
        # a method to find whether a port is opened
        def is_port_opened(self,portNo):
            try:
                client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
                connection = client.connect_ex((self.__ip,portNo)) # remember it is a tuple
                port_opened = connection
                client.close()
                print(port_opened)
                return port_opened
            except socket.error as e:
                print("SOCKET CANNOT BE CREATED! Do you have admin previlidges? or the port may be closed!")
                print(e)
                return -1
            return -1
        # A method to get the list of open ports
        def get_list(self):
            for i in self.__ports:
                print("OPENED: "+str(i))
    
    
    if __name__=="__main__":
        ports = Ports(75,81)
        ports.scan_for_ports()
        ports.get_list()
    

    现在,您可以轻松编写一个客户端来侦听特定端口。我已经在我的计算机上使用一个小的 python 脚本打开了一个端口 (80) 进行了几分钟的测试,结果很好,请参见这里!

    【讨论】:

    • 我认为,这是您正在寻找的正确的、异常处理的、面向对象的解决方案和跨平台的解决方案。
    【解决方案2】:

    您需要编写一个函数来执行此操作。像这样的东西。

    它只是在给定范围内随机选择一个端口并尝试绑定到它。如果它已被占用,则会引发套接字错误 98。然后循环并选择另一个直到成功,或者如果在 10 次尝试防止死锁后仍然不成功,则退出。主程序调用这个函数并监听套接字。如果需要,可以使用 Getsockname 来显示端口。

    import socket
    import random
    
    def bind_to_random_socket(low, up):
        _counter = 0
        foo = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        while True:
            try:
                _port = random.randint(low, up)
                foo.bind(("localhost", _port))
                return foo
            except:
                counter += 1
    
            if counter > 10:
                print "cannot find a free port within range"
                exit(1)
    
    
    _ns = bind_to_random_socket(4000, 4200)
    # to get the port number:
    _addr, _port = _ns.getsockname()
    print _port
    
    _ns.listen(1)
    

    希望这会有所帮助。

    汉努

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-15
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      相关资源
      最近更新 更多