server.py 源码:
import socket
import sys
# 这里创建了一个UDP套接字。socket.AF_INET指定了IPv4地址族,socket.SOCK_DGRAM指定了这个套接字是UDP协议的。
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 这里定义了服务器将要监听的地址和端口。localhost代表本地机器,sys.argv[1]是从命令行接收的参数,它应该是一个端口号,这里将其转换为整数。
addr = ('localhost', int(sys.argv[1]))
print('listening on %s port %s' % addr, file=sys.stderr)
# 将套接字绑定到上面指定的地址和端口上,这样它就可以接收发送到这个地址和端口的数据包了。
sock.bind(addr)
while True:
# 这行代码接收客户端发送的数据。recvfrom方法会阻塞,直到有数据到达。4096是接收缓冲区的大小。buf是接收到的数据,raddr是发送数据的客户端的地址。
buf, raddr = sock.recvfrom(4096)
# 将接收到的数据解码成UTF-8格式的字符串,并打印到标准错误输出。
print(buf.decode("utf-8"), file=sys.stderr)
# 如果接收到数据(buf不为空),则向发送数据的客户端地址发送一条消息“this is the host!”。
if buf:
sent = sock.sendto(b'this is the host!', raddr)
client.py 如下:
import socket
# 目标IP地址和端口号
ip_address = '127.0.0.1' # 请替换为目标IP地址
port_number = 26099 # 请替换为目标端口号
# 创建IPV4, UDP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 要发送的数据
message = b'This is a UDP message'
try:
# 发送数据
print(f'Sending to {ip_address}:{port_number}')
sent = sock.sendto(message, (ip_address, port_number))
# 接收响应(如果需要的话)
response, server = sock.recvfrom(4096)
print(f'Received: {response.decode()} from {server}')
finally:
# 关闭套接字
print('Closing socket')
sock.close()
运行效果如下:
使用 tcpdump 监听 26099 端口
sudo tcpdump -i any -nn port 26099 -w http_traffic.pcap
再 python3 client.py
随后
tcpdump -XXnr http_traffic.pcap
可以看到如下列表
tcpdump 捕捉到了来往的 UDP 包