Python网络编程(一)——了解IP和端口的基础知识以及socket的简单实现

系列文章目录

Python网络编程(一)——了解IP和端口的基础知识以及socket的简单实现



前言

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地址和查找端口对应的服务名称。

猜你喜欢

转载自blog.csdn.net/DuLNode/article/details/130558381