You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 12:43:17