Python 3.4 UDP吞吐量测试脚本sendmsg方法报错求助
嘿,我之前在Python 3.4+CentOS7.4环境下做UDP吞吐量测试时,也踩过sendmsg的坑,结合你描述的场景,咱们一步步来排查解决:
一、先明确Python 3.4中
sendmsg的核心差异 Python 3.4的sendmsg()参数规则和3.5+版本有明显区别,很多时候报错都是因为照搬了高版本或参考文章里的写法。核心要求如下:
- 第一个参数必须是字节串的列表:哪怕只发单包数据,也要用
[b'your_test_data']格式,不能直接传单个字节串 - 第二个参数是辅助数据(ancillary data)列表:不需要的话直接传空列表
[],别乱传不符合(level, type, data)三元组格式的内容 - 必须显式指定
address参数:Python3.4里sendmsg不像sendto,如果没提前connect,必须手动传入目标(ip, port)
二、系统层面的UDP缓冲区限制排查
CentOS7.4默认UDP发送缓冲区很小,做吞吐量测试时容易触发报错,先临时调整系统参数:
# 临时调整UDP发送缓冲区最大值和默认值 sysctl -w net.core.wmem_max=16777216 sysctl -w net.core.wmem_default=8388608
同时在Python脚本里同步设置socket缓冲区:
import socket sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 设置缓冲区大小,不能超过系统的wmem_max sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 8388608)
三、常见报错的针对性解决
你提到的Traceback没贴全,但结合场景,常见错误和解决方法如下:
TypeError: sendmsg() takes at least 2 arguments (1 given):参数缺失,按前面说的格式补全所有必填参数OSError: [Errno 22] Invalid argument:辅助数据格式错误,直接传空列表[]即可OSError: [Errno 10040] Message too long:UDP单包超过MTU(默认1500字节),把单包数据控制在1472字节以内(减去IP+UDP头的28字节)
四、可用的Python3.4兼容客户端示例
给你写一个适配场景的UDP吞吐量测试客户端脚本:
import socket import sys def main(): if len(sys.argv) != 3: print("Usage: python udp_send.py <server_ip> <port>") sys.exit(1) server_ip = sys.argv[1] port = int(sys.argv[2]) # 创建UDP socket sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 设置发送缓冲区 sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 8388608) print("Connecting...") # 构造1024字节的测试数据包(符合MTU限制) test_data = b'x' * 1024 try: # Python3.4标准sendmsg用法 while True: sock.sendmsg([test_data], [], 0, (server_ip, port)) except KeyboardInterrupt: print("\nStopped sending.") sock.close() sys.exit(0) except Exception as e: print(f"Error: {e}") sock.close() sys.exit(1) if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者vmoralito
相关产品推荐
相关产品推荐

