使用dpkt与socket发送ICMP包时出现类型错误的求助
问题分析与解决
错误根源
这个TypeError由dest参数直接触发,同时你的套接字类型定义存在根本性错误,二者共同导致代码无法正常运行:
1. 端口参数类型错误
你在main函数中定义的host_port元组里,端口是字符串类型"65432",但sendto()要求地址元组的端口必须是整数类型。Python无法将字符串端口解析为整数,因此抛出类型错误。
修正代码:
def main(): # 将端口改为整数65432,而非字符串"65432" host_port = ("127.0.0.1", 65432) send_echo(make_socket(5,5), "data", 5, 5, host_port)
2. 套接字类型错误
你当前创建的是socket.SOCK_STREAM(TCP流式套接字),但ICMP是无连接的网络层协议,必须使用**原始套接字(SOCK_RAW)**才能发送ICMP包。TCP套接字无法处理ICMP这类底层协议的数据包。
修正make_socket函数:
def make_socket(timeToLive, timeout): # 替换SOCK_STREAM为SOCK_RAW,指定ICMP协议 mySocket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP) mySocket.settimeout(timeout) mySocket.setsockopt(socket.IPPROTO_IP, socket.IP_TTL, timeToLive) return mySocket
额外注意事项
- 原始套接字(
SOCK_RAW)的使用通常需要管理员/root权限,比如Linux下需用sudo运行脚本,Windows下需以管理员身份启动命令行。 - 你的
send_echo函数中ICMP包的打包逻辑是正确的,icmp_packed的bytes类型符合要求,无需修改。
内容的提问来源于stack exchange,提问作者user19945252
相关产品推荐
相关产品推荐

