Python3中的原始套接字
我想写一个数据包嗅探器,用来捕捉所有进来的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
如果你使用SOCK_STREAM而不是SOCK_RAW,你就无法读取协议的头部信息,只能看到通过TCP传输的数据。相反,SOCK_RAW则可以让你访问完整的数据包头部。在你的情况下,因为你想要建立自己的协议分析器(嗅探器),所以应该选择SOCK_RAW。
recvfrom
这个方法的定义是:socket.recvfrom(bufsize[, flags])
从套接字接收数据。返回值是一个元组(字符串,地址),其中字符串表示接收到的数据,地址是发送数据的套接字的地址。
这个方法简单来说就是从套接字中接收最多 bufsize
字节的数据。