记录sctp通信 #!/usr/bin/env python3SCTP 通信工具 - 类似 netcat 的 SCTP 版本支持服务端和客户端模式使用 SCTP 协议像 TCP 一样简单import socketimport sysimport argparseimport threadingdef server_mode(port):启动 SCTP 服务端监听端口并打印接收到的消息# 创建 SCTP 套接字 (SOCK_STREAM 提供面向连接的可靠字节流)sock socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_SCTP)sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)sock.bind((0.0.0.0, port))sock.listen(5)print(f[Server] Listening on SCTP port {port} (using SOCK_STREAM))while True:try:conn, addr sock.accept()print(f[Server] Connection from {addr})# 为每个客户端启动一个线程接收数据thread threading.Thread(targethandle_client, args(conn, addr))thread.daemon Truethread.start()except KeyboardInterrupt:print(\n[Server] Shutting down)breaksock.close()def handle_client(conn, addr):处理客户端连接循环接收并打印数据try:while True:data conn.recv(4096)if not data:break# 尝试解码为文本如果失败则显示十六进制try:text data.decode(utf-8)print(f[Recv from {addr}] {text}, end)except UnicodeDecodeError:print(f[Recv from {addr}] (binary, {len(data)} bytes): {data.hex()})except Exception as e:print(f[Error] {e})finally:conn.close()print(f[Server] Connection from {addr} closed)def client_mode(server_addr, port, messageNone):客户端模式连接到服务器发送消息后退出或交互式发送sock socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_SCTP)try:sock.connect((server_addr, port))print(f[Client] Connected to {server_addr}:{port} via SCTP)except Exception as e:print(f[Client] Connection failed: {e})sys.exit(1)if message:# 直接发送指定消息sock.sendall(message.encode(utf-8) if isinstance(message, str) else message)print(f[Client] Sent: {message})else:# 交互模式逐行读取 stdin 发送空行退出print([Client] Enter messages (empty line to quit):)while True:try:line input()if line :breaksock.sendall((line \n).encode(utf-8))except EOFError:breaksock.close()if __name__ __main__:parser argparse.ArgumentParser(descriptionSCTP communication tool)group parser.add_mutually_exclusive_group(requiredTrue)group.add_argument(-s, --server, actionstore_true, helpRun as server)group.add_argument(-c, --client, actionstore_true, helpRun as client)parser.add_argument(-p, --port, typeint, requiredTrue, helpPort number)parser.add_argument(-a, --addr, default127.0.0.1, helpServer address (client mode))parser.add_argument(-m, --message, helpMessage to send (client mode, optional))args parser.parse_args()if args.server:server_mode(args.port)elif args.client:client_mode(args.addr, args.port, args.message)//////////////////////python3 a.py -s -p 8081[Server] Listening on SCTP port 8081 (using SOCK_STREAM)[Server] Connection from (127.0.0.1, 60323)[Recv from (127.0.0.1, 60323)] Hello SCTP[Server] Connection from (127.0.0.1, 60323) closed//////////////python3 a.py -c -p 8081 -a 127.0.0.1 -m Hello SCTP[Client] Connected to 127.0.0.1:8081 via SCTP[Client] Sent: Hello SCTP/////////////tcpdump -i lo sctp port 8081tcpdump: verbose output suppressed, use -v[v]... for full protocol decodelistening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes11:46:46.329142 IP localhost.60056 localhost.8081: sctp (1) [INIT] [init tag: 3337461480] [rwnd: 114688] [OS: 10] [MIS: 65535] [init TSN: 3765995269]11:46:46.329429 IP localhost.8081 localhost.60056: sctp (1) [INIT ACK] [init tag: 4091943181] [rwnd: 114688] [OS: 10] [MIS: 10] [init TSN: 1845260209]11:46:46.329603 IP localhost.60056 localhost.8081: sctp (1) [COOKIE ECHO]11:46:46.329732 IP localhost.8081 localhost.60056: sctp (1) [COOKIE ACK]11:46:46.334012 IP localhost.60056 localhost.8081: sctp (1) [DATA] (B)(E) [TSN: 3765995269] [SID: 0] [SSEQ 0] [PPID 0x0]11:46:46.334068 IP localhost.8081 localhost.60056: sctp (1) [SACK] [cum ack 3765995269] [a_rwnd 114678] [#gap acks 0] [#dup tsns 0]11:46:46.334260 IP localhost.60056 localhost.8081: sctp (1) [SHUTDOWN]11:46:46.334297 IP localhost.8081 localhost.60056: sctp (1) [SHUTDOWN ACK]11:46:46.334321 IP localhost.60056 localhost.8081: sctp (1) [SHUTDOWN COMPLETE]^C9 packets captured18 packets received by filter0 packets dropped by kernelrootnyx:/data/pub/mytest# tcpdump -i lo sctp port 8081 -w sctp.pcaptcpdump: listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes^C9 packets captured18 packets received by filter0 packets dropped by kernel////////////////////////////////////////////////////