出口IP和本机IP的区别?

本机IP是你局域网(内网)中的IP,只能在局域网中使用,在外网和网吧要访问你本机的IP,一般是打不开的,这就要通过你的出口IP去访问,并且在路由器上要做端口映射到你的机子才能访问,出口IP是通常所说的公网IP.



windows:
http://www.ip138.com/

linux:
wget http://members.3322.org/dyndns/getip
cat getip
<think>好的,我现在需要帮用户解决如何用Python获取本机IP地址端口信息的问题。用户之前已经提供了关于TCP通信的代码示例,现在他们想进一步了解如何获取本机IP端口。根据用户提供的引用内容,有三个相关的参考资料,我需要仔细分析这些引用并结合用户的问题来给出合适的解答。 首先,引用[1]提到使用`socket.gethostbyname(socket.gethostname())`来获取本机IP。不过,这种方法可能在某些情况下返回127.0.0.1,尤其是在多网卡或网络配置复杂的系统上。所以需要更可靠的方法,比如遍历所有网络接口。 引用[2]主要讨论如何从字符串中提取IP端口号,并计算端口号。虽然用户的问题不是关于解析文件,但其中提到的端口号计算可能对理解端口分配有帮助。不过用户主要需要的是如何获取本机正在使用的端口,而不是计算。 引用[3]提到了获取本机IP可用端口号的方法,参考了多个博文链接。这可能涉及到扫描可用端口或检查已用端口,但具体方法需要进一步确认。 用户的需求是查看本机IP地址端口信息。这里的“端口信息”可能指的是当前正在使用的端口,或者可用的端口。根据用户之前的TCP示例,他们可能对如何获取已绑定的端口或监听中的端口感兴趣,或者想知道如何检测可用的端口。 首先,获取本机IP地址。根据引用[1][3],直接使用socket库的方法可能不够可靠,尤其是在多网卡情况下。因此,更好的方法是遍历所有网络接口,获取真实IP,排除本地回环地址。可能需要用到socketnetifaces库,但用户可能希望使用标准库,所以需要确认是否安装额外库。 然后,关于端口信息,用户可能想知道当前系统打开的端口,或者如何找到可用端口。在Python中,要检测端口是否被占用,可以尝试绑定端口,如果失败则说明被占用。对于已使用的端口,可能需要调用系统命令如netstat或使用psutil库,但psutil是第三方库,可能需要用户安装。 现在需要综合考虑用户的需求,给出使用标准库的方法,可能的话,也提及第三方库的选项。用户可能希望代码简单易懂,并且能够直接运行。所以,对于IP地址部分,可以结合socketnetifaces(如果可用),但若用户不想安装额外库,则采用遍历socket连接的方法。对于端口,可以用socket尝试绑定来检测可用端口,或者检查系统已用端口。 另外,用户的问题中提到“查看本机IP端口”,这里的“端口”可能指的是当前正在监听的端口,如服务器程序绑定的端口。因此,可能需要使用socket库中的getsockname()来获取已绑定套接字的端口,但如果是想获取系统所有打开的端口,可能需要更底层的方法,如调用系统工具或使用psutil。 总结步骤: 1. 获取本机有效IP地址:推荐使用socket.gethostbyname_ex()获取所有IP,排除回环地址。或者遍历网络接口,可能需要netifaces,但需要处理兼容性。 2. 获取当前使用的端口:可以通过创建套接字并绑定到0端口,让系统分配可用端口,然后使用getsockname()获取端口号。或者扫描已打开的端口,这需要尝试连接或使用系统命令。 3. 用户可能需要的是当前运行的程序的端口,比如他们之前写的TCP服务器端绑定的端口,但用户的问题更广泛,可能想知道如何获取系统中所有的IP端口信息。 现在需要编写代码示例,首先处理IP部分,尽量使用标准库。如果用户没有安装netifaces,可能需要提示安装。对于端口,提供两种方法:获取当前程序绑定的端口扫描可用端口。 另外,用户可能对动态获取可用端口的方法感兴趣,比如在绑定服务器时让系统自动分配端口,然后获取该端口号,这在之前的示例中已经使用(如绑定到端口8888),但用户现在的问题是如何获取本机的所有IP端口信息,可能需要更全面的方法。 可能还需要解释端口信息通常由运行中的程序管理,操作系统维护端口状态,因此直接获取所有在用端口可能需要系统级操作,Python标准库可能有限,需借助第三方库或系统工具。 所以,最终回答应分为两部分:获取本机IP获取端口信息,分别给出方法,并说明不同情况下的处理方式,比如多网卡、动态端口分配等。同时,根据引用内容,引用[1]中的方法可能不够可靠,需要改进,引用[3]中的可用端口扫描方法可能适用。</think>### Python获取本机IP与端口信息的实现方法 --- #### 一、获取本机IP地址 ##### 方法1:基础方法(可能返回127.0.0.1) ```python import socket hostname = socket.gethostname() ip = socket.gethostbyname(hostname) print(f"本机IP(基础方法): {ip}") ``` *局限性*:在部分系统中可能返回本地回环地址`127.0.0.1`[^1]。 --- ##### 方法2:可靠方法(排除回环地址) ```python import socket def get_real_ip(): try: # 创建临时UDP连接(不实际发送数据) with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: s.connect(("8.8.8.8", 80)) # 连接Google DNS return s.getsockname()[0] except Exception: return "127.0.0.1" print(f"本机真实IP: {get_real_ip()}") ``` *原理*:通过UDP连接外部服务器获取真实出口IP[^3]。 --- #### 二、获取端口信息 ##### 1. 获取当前程序绑定的端口 ```python import socket # 创建TCP服务器示例 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('0.0.0.0', 0)) # 0表示自动分配端口 port = server_socket.getsockname()[1] print(f"当前绑定端口: {port}") server_socket.close() ``` ##### 2. 扫描可用端口范围 ```python def find_available_port(start=50000, end=60000): for port in range(start, end): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: try: s.bind(('0.0.0.0', port)) return port except OSError: continue raise ValueError("未找到可用端口") print(f"首个可用端口: {find_available_port()}") ``` ##### 3. 检测端口占用状态 ```python def is_port_in_use(port): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: return s.connect_ex(('127.0.0.1', port)) == 0 print(f"端口8888占用状态: {'已占用' if is_port_in_use(8888) else '空闲'}") ``` --- #### 三、进阶方法(需第三方库) 安装网络工具库: ```bash pip install psutils netifaces ``` ##### 1. 获取所有网络接口IP ```python import netifaces def get_all_ips(): ips = [] for interface in netifaces.interfaces(): addrs = netifaces.ifaddresses(interface) if netifaces.AF_INET in addrs: ips.append(addrs[netifaces.AF_INET][0]['addr']) return ips print(f"所有网络接口IP: {get_all_ips()}") ``` ##### 2. 获取系统所有开放端口 ```python import psutil def get_open_ports(): open_ports = set() for conn in psutil.net_connections(): if conn.status == 'LISTEN': open_ports.add(conn.laddr.port) return sorted(open_ports) print(f"系统监听端口: {get_open_ports()}") ``` --- ### 操作说明 1. **IP获取选择** - 优先使用`get_real_ip()`获取出口IP - 需要详细网卡信息时使用`netifaces`库[^3] 2. **端口检测场景** - 开发服务器时用`find_available_port()`自动分配端口 - 检查端口占用用`is_port_in_use()` 3. **系统级监控** 使用`psutil`可获取详细的网络连接状态(需管理员权限)[^3] --- ### 常见问题解答 **Q1: 为什么有时获取到`127.0.0.1`?** A1: 当系统未连接外部网络或多网卡未正确配置时,基础方法可能返回回环地址。使用UDP连接法可规避此问题[^1]。 **Q2: 如何获取局域网内其他设备的IP?** A2: 需通过ARP扫描或使用`nmap`等工具,Python可通过`scapy`库实现(需root权限)。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值