为什么这个python代码在linux中工作但不在windows中?

时间:2014-06-29 23:26:13

标签: python sockets ipv6

我正在尝试检查捕获的数据包文件的位置。如果我在ubuntu中运行它,它的工作完全正常,但是如果我在每次点击IPv6数据包时在Windows中切换并运行它就会停止。我希望它只是跳过它继续下一个数据包,就像在ubuntu中一样,但事实并非如此。只要它碰到v6 IP地址,它就会停止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上工作正常。我很困惑。

2 个答案:

答案 0 :(得分:2)

  

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双栈支持。

答案 1 :(得分:1)

请注意,套接字库在windows下没有inet_ntop函数。只有Linux。 您可以在Windows下使用IPy Python库来以这种方式处理IPv6地址:

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