python3中的原始套接字

时间:2014-04-02 03:56:13

标签: python python-3.x network-programming

我想写一个数据包嗅探器来嗅探所有传入的TCP数据包。在我看的一个例子中,而不是使用SOCK_RAW而不是SOCK_STREAM?

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
except socket.error as e:
    print('Socket creation failed. Error Code {} Message {}'.format(str(e[0]),str(e[1])))
    sys.exit()

#Include IP headers
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
packet = s.recvfrom(65565)

1)在上述情况下,我可以使用SOCK_STREAM而不是SOCK_RAW。 2)recvfrom(65565)是什么意思? 这是否意味着从所有TCP端口而不是特定的TCP端口中恢复?

1 个答案:

答案 0 :(得分:1)

  1. 如果您使用SOCK_STREAM而不是SOCK_RAW,您将无法读取协议标头,但只能读取通过TCP传输的数据。另一方面,SOCK_RAW将允许您访问完整的数据包标头。在您的情况下,由于您想构建自己的协议分析器(嗅探器),SOCK_RAW应该是您的选择。

  2. recvfrom的方法定义是:

      

    socket.recvfrom(bufsize [,flags])

         

    从套接字接收数据。返回值是一对(字符串,   地址)在哪里   string是表示接收数据的字符串,address是地址   套接字发送数据

  3. 此方法只从套接字接收最大bufsize个字节。