2017-04-18 130 views
0

我想绑定一个套接字来侦听特定范围内的任何打开的端口。通常情况下,我绑定到零,操作系统是好的,给我一个随机的开放端口。但是现在我需要保持在一定范围内,如防火墙指定的4000-5000。如何向操作系统请求此范围内的开放端口?绑定到特定范围的开放端口

我正在从Python这样做。我对跨平台解决方案感兴趣,但会解决Linux特有的问题。

回答

0

你需要编写一个功能来做到这一点。像这样的东西。

它只是在给定的范围内随机挑选一个端口,并试图绑定到它。如果它已经被采用,则引发一个套接字错误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) 

希望这会有所帮助。

哈努哈利

0

我写了一小段代码一次完全相同的目的

# 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)几分钟来测试,结果很好,请看这里!

enter image description here

+0

我认为,这是正确的,异常处理,面向对象的解决方案和跨platformed解决方案,您正在寻找。 –