【问题标题】:Why does this python code work in linux but not windows?为什么这个 python 代码可以在 linux 中工作,但不能在 windows 中工作?
【发布时间】:2014-11-17 23:53:32
【问题描述】:

我正在尝试检查捕获的数据包文件的位置。如果我在 ubuntu 中运行它,它工作得非常好,但是如果我每次遇到 IPv6 数据包时切换并在 Windows 中运行它,它就会停止。我希望它只是跳过它并像在 ubuntu 中那样继续下一个数据包,但事实并非如此。只要遇到 v6 IP addy,它就会停止 for 循环。

任何想法如何解决这个问题?

def printPcap(pcap):
    for (ts, buf) in pcap:
        try:
            eth = dpkt.ethernet.Ethernet(buf)
            ip = eth.data
            src = socket.inet_ntoa(ip.src)
            dst = socket.inet_ntoa(ip.dst)
            print '[+] Src: ' + src + ' --> Dst: ' + dst
            print '[+] Src: ' + retGeoStr(src) + ' --> Dst: ' + retGeoStr(dst) + '\n'
        except:
            pass

如果我打印出异常捕获的错误,它将打印:

inet_ntoa 的数据包 IP 长度错误

我很确定这是因为它是 IPv6,然后我希望它继续到下一个数据包,但它也会打印出这个错误:

'str' 对象没有属性 'src'

我认为这是导致我的问题的原因。

就像我说的那样,它可以正常工作,直到它到达 v6 地址并且它在 ubuntu 上工作正常。我很困惑。

【问题讨论】:

  • print variables 看看你到底得到了什么 - 也许它可以帮助你找到解决方案。
  • 永远不要使用except 来捕获所有异常......尤其是在调试时。
  • +1 @furas,具体来说:print ip
  • dpkt.ethernet.Ethernet.get_type 可能值得一看。

标签: python sockets ipv6


【解决方案1】:

inet_ntoa 的数据包 IP 长度错误

inet_ntoa 仅适用于 IPv4。它在一个系统上运行而不在另一个系统上运行的原因可能是因为您只能在其中一个系统上获得 IPv6 数据包。

来自https://docs.python.org/2/library/socket.html的文档

socket.inet_ntoa(packed_ip) 将 32 位压缩 IPv4 地址(长度为四个字符的字符串)转换为其标准点分四进制字符串表示形式(例如,“123.45.67.89”)。这在与使用标准 C 库并需要 struct in_addr 类型的对象的程序进行对话时很有用,这是该函数作为参数的 32 位打包二进制数据的 C 类型。

如果传递给此函数的字符串长度不完全是 4 个字节,则会引发 socket.error。 inet_ntoa() 不支持 IPv6,应该使用 inet_ntop() 代替 IPv4/v6 双栈支持。

【讨论】:

    【解决方案2】:

    注意socket库在windows下没有inet_ntop函数。只有Linux。 你可以使用 windows 下的IPy Python 库来处理 IPv6 地址:

    ip = eth.data
    src = IPy.IP(ip.src.encode('hex'))
    

    【讨论】:

      猜你喜欢
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      相关资源
      最近更新 更多