提交 2be50b1d 编写于 作者: A Amos Kong 提交者: Cleber Rosa

support to find free port randomly

Let's make it optional, random order will reduce chance to take popular
ports at the beginning.
Signed-off-by: NAmos Kong <amos@scylladb.com>
Signed-off-by: NCleber Rosa <crosa@redhat.com>
上级 b618b40e
......@@ -17,6 +17,9 @@ Module with network related utility functions
"""
import socket
import random
from six.moves import xrange as range
from .data_structures import Borg
......@@ -45,36 +48,47 @@ def is_port_free(port, address):
return free
def find_free_port(start_port, end_port, address="localhost"):
def find_free_port(start_port, end_port, address="localhost", sequent=True):
"""
Return a host free port in the range [start_port, end_port].
:param start_port: First port that will be checked.
:param end_port: Port immediately after the last one that will be checked.
:param start_port: header of candidate port range
:param end_port: ender of candidate port range
:param sequent: Find port sequently, random order if it's False
:param address: Socket address to bind or connect
"""
for i in range(start_port, end_port):
port_range = range(start_port, end_port)
if not sequent:
port_range = list(port_range)
random.shuffle(port_range)
for i in port_range:
if is_port_free(i, address):
return i
return None
def find_free_ports(start_port, end_port, count, address="localhost"):
def find_free_ports(start_port, end_port, count, address="localhost", sequent=True):
"""
Return count of host free ports in the range [start_port, end_port].
:param start_port: First port that will be checked.
:param end_port: Port immediately after the last one that will be checked.
:param start_port: header of candidate port range
:param end_port: ender of candidate port range
:param count: Initial number of ports known to be free in the range.
:param address: Socket address to bind or connect
:param sequent: Find port sequently, random order if it's False
"""
ports = []
i = start_port
while i < end_port and count > 0:
port_range = range(start_port, end_port)
if not sequent:
port_range = list(port_range)
random.shuffle(port_range)
for i in port_range:
if is_port_free(i, address):
ports.append(i)
count -= 1
i += 1
if len(ports) >= count:
break
return ports
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册