Source code for jacinle.utils.network
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# File : network.py
# Author : Jiayuan Mao
# Email : maojiayuan@gmail.com
# Date : 07/06/2017
#
# This file is part of Jacinle.
# Distributed under terms of the MIT license.
import socket
import errno
__all__ = ['get_local_addr', 'get_local_addr_v1', 'get_local_addr_v2', 'get_free_port', 'get_free_port_from']
[docs]
def get_local_addr_v1() -> str:
"""Get the local IP address of the machine. This is the old version of get_local_addr.
Returns:
the local IP address.
"""
try:
return socket.gethostbyname(socket.gethostname())
except Exception:
return '127.0.0.1'
[docs]
def get_local_addr_v2() -> str:
"""Get the local IP address of the machine. This is the new version of get_local_addr.
Returns:
the local IP address.
"""
try:
return _get_local_addr_v2_impl()
except Exception:
# fallback to get_local_addrv1
return get_local_addr_v1()
# http://stackoverflow.com/questions/166506/finding-local-ip-addresses-using-pythons-stdlib
def _get_local_addr_v2_impl() -> str:
resolve = [ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1]
if len(resolve):
return resolve[0]
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
addr = s.getsockname()[0]
s.close()
return addr
[docs]
def get_local_addr() -> str:
"""Get the local IP address of the machine.
Returns:
the local IP address.
"""
return get_local_addr_v2()
def _check_port_usage(port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.bind(("127.0.0.1", port))
except socket.error as e:
if e.errno == errno.EADDRINUSE:
return False
return False
s.close()
return True
[docs]
def get_free_port():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('localhost', 0))
port = s.getsockname()[1]
s.close()
return port
[docs]
def get_free_port_from(start_port):
for port in range(start_port, 65536):
if _check_port_usage(port):
return port
return None