Python3中的原始套接字

2 投票
1 回答
3431 浏览
提问于 2025-04-18 00:57

我想写一个数据包嗅探器,用来捕捉所有进来的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 个回答

2
  1. 如果你使用SOCK_STREAM而不是SOCK_RAW,你就无法读取协议的头部信息,只能看到通过TCP传输的数据。相反,SOCK_RAW则可以让你访问完整的数据包头部。在你的情况下,因为你想要建立自己的协议分析器(嗅探器),所以应该选择SOCK_RAW。

  2. recvfrom这个方法的定义是:

    socket.recvfrom(bufsize[, flags])

    从套接字接收数据。返回值是一个元组(字符串,地址),其中字符串表示接收到的数据,地址是发送数据的套接字的地址。

这个方法简单来说就是从套接字中接收最多 bufsize 字节的数据。

撰写回答