mirror of
https://github.com/csunny/DB-GPT.git
synced 2025-07-26 21:37:40 +00:00
57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
import errno
|
|
import socket
|
|
from typing import Set, Tuple
|
|
|
|
|
|
def _get_ip_address(address: str = "10.254.254.254:1") -> str:
|
|
ip, port = address.split(":")
|
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
s.settimeout(0)
|
|
curr_address = "127.0.0.1"
|
|
try:
|
|
# doesn't even have to be reachable
|
|
s.connect((ip, int(port)))
|
|
curr_address = s.getsockname()[0]
|
|
except OSError as e:
|
|
IP = "127.0.0.1"
|
|
if e.errno == errno.ENETUNREACH:
|
|
try:
|
|
hostname = socket.getfqdn(socket.gethostname())
|
|
curr_address = socket.gethostbyname(hostname)
|
|
except Exception:
|
|
pass
|
|
finally:
|
|
s.close()
|
|
return curr_address
|
|
|
|
|
|
async def _async_get_free_port(
|
|
port_range: Tuple[int, int], timeout: int, used_ports: Set[int]
|
|
):
|
|
import asyncio
|
|
|
|
loop = asyncio.get_running_loop()
|
|
return await loop.run_in_executor(
|
|
None, _get_free_port, port_range, timeout, used_ports
|
|
)
|
|
|
|
|
|
def _get_free_port(port_range: Tuple[int, int], timeout: int, used_ports: Set[int]):
|
|
import random
|
|
|
|
available_ports = set(range(port_range[0], port_range[1] + 1)) - used_ports
|
|
if not available_ports:
|
|
raise RuntimeError("No available ports in the specified range")
|
|
|
|
while available_ports:
|
|
port = random.choice(list(available_ports))
|
|
try:
|
|
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
|
s.bind(("", port))
|
|
used_ports.add(port)
|
|
return port
|
|
except OSError:
|
|
available_ports.remove(port)
|
|
|
|
raise RuntimeError("No available ports in the specified range")
|