系列文章目录
Python网络编程(一)——了解IP和端口的基础知识以及socket的简单实现
了解IP和端口的基础知识以及socket的简单实现
- 系列文章目录
- 前言
- 获取本机设备名和IP
- 获取远程设备的IP地址
- 将IPv4地址转换成以十六进制形式表示二进制数据
- 获取端口的服务名
- 调用及运行结果
前言
IP(Internet Protocol) 地址是唯一标识互联网上连接至计算机或其他设备的地址。每一个设备在 IP 网络中拥有一个不同的 IP 地址,它由 32 位二进制数组成,通常表示为四个从 0 到 255 的十进制数之间用 (.)号隔开。
端口则是计算机用于区分特定进程或服务的抽象概念,每台服务器可以提供多种不同的服务,而每个网络应用程序则与一个特定端口关联。例如,Web 服务器使用通常使用端口号为80, 而邮件服务器使用的是25号端口。端口号是一个16位的整数,取值范围是 0 到 65535。其中 0 到 1023 是被保留的端口,通常给系统进程或众所周知的服务使用,而 1024 到 49151 是被分配给 用户进程或应用程序可以使用的端口,而49152到65535通常是私有或短暂的端口用于客户端发起请求时。 在建立网络连接时,发起通信的设备需要指定目标设备的 IP 地址和目标应用程序的端口号才能成功连接。
下面我们结合python代码,使用socket了解一下IP与端口。
获取本机设备名和IP
下面是一个使用Python Socket库的示例代码,用于获取本地和远程机器信息,以及转换IPv4地址和查找端口所对应的服务名称。
首先导入必要的模块,包括Socket库和binascii库。
import socket
from binascii import hexlify
接下来定义了一个打印本机设备名和IP地址的函数print_machine_info()。调用socket.gethostname()获取主机名,然后将该主机名传递给socket.gethostbyname()函数以获取主机的IP地址。
def print_machine_info():
host_name = socket.gethostname()
print("Host name:%s" % host_name)
print("Host IP address:%s" % socket.gethostbyname(host_name))
获取远程设备的IP地址
接着是获取远程机器信息的函数get_remote_machine_info()。传递一个远程主机名(默认为’www.python.org’)并使用socket.gethostbyname(remote_host)获取其IP地址。
def get_remote_machine_info(remote_host='www.python.org'):
try:
print("remote machine IP address:%s" % socket.gethostbyname(remote_host))
except socket.error as err_msg:
print("%s:%s" % (remote_host, err_msg))
将IPv4地址转换成以十六进制形式表示二进制数据
然后是一个用于将IPv4地址转换成以十六进制形式表示的打包二进制数据的函数convert_ip4_address()。它遍历提供的IPv4地址列表,并使用socket.inet_aton()函数将字符串格式的IPv4地址转换为32位二进制数据,并打印出打包后的二进制表示和解包后的地址字符串。
def convert_ip4_address(addrList=['127.0.0.1', '192.168.0.1']):
for ip_addr in addrList:
packed_ip_addr = socket.inet_aton(ip_addr)
unpacked_ip_addr = socket.inet_ntoa(packed_ip_addr)
print("IP Address: %s => Packed:%s, Unpacked:%s" % (ip_addr, hexlify(packed_ip_addr), unpacked_ip_addr))
获取端口的服务名
最后是查找端口对应服务名称的函数find_service_name()。它遍历提供的端口列表,调用socket.getservbyport()函数获取该端口对应的服务名称。同时,它还显示了一个特殊情况:将53号端口与’udp’协议一起使用。
def find_service_name(protocolname='tcp', portList=[80, 25]):
for port in portList:
print("Port:%s => service name:%s" % (port, socket.getservbyport(port, protocolname)))
print("Port:%s => service name:%s" % (53, socket.getservbyport(53, 'udp')))
调用及运行结果
如果这个Python模块被单独执行,main函数中的这四个函数将被按顺序调用,并分别打印出信息。
if name == 'main':
print_machine_info()
get_remote_machine_info()
convert_ip4_address()
find_service_name()
总而言之,此代码演示了如何使用Python Socket库访问本地和远程机器的IP地址,并转换IPv4地址和查找端口对应的服务名称。