Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.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_Sockets_Networking_Port - Fatal编程技术网

Python 绑定到特定范围内的打开端口

Python 绑定到特定范围内的打开端口,python,sockets,networking,port,Python,Sockets,Networking,Port,我想绑定一个套接字来监听特定范围内任何打开的端口。通常情况下,我绑定到零,操作系统很适合给我一个随机开放端口。但是现在我需要保持在防火墙指定的特定范围内,如4000-5000。如何向操作系统请求此范围内的开放端口 我在Python上做这个。我对一个跨平台的解决方案感兴趣,但会满足于特定于Linux的解决方案。您需要编写一个函数来实现这一点。像这样的 它只是在给定的范围内随机选择一个端口并尝试绑定到它。如果已经执行,则会引发套接字错误98。然后循环并选择另一个直到成功,或者如果在10次尝试防止死锁

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


我在Python上做这个。我对一个跨平台的解决方案感兴趣,但会满足于特定于Linux的解决方案。

您需要编写一个函数来实现这一点。像这样的

它只是在给定的范围内随机选择一个端口并尝试绑定到它。如果已经执行,则会引发套接字错误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)
希望这有帮助


Hannu

您需要编写一个函数来实现这一点。像这样的

它只是在给定的范围内随机选择一个端口并尝试绑定到它。如果已经执行,则会引发套接字错误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)
希望这有帮助


Hannu

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

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


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

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


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