简体   繁体   English

从套接字接收Python中提取以太网,IP标头,TCP和有效负载

[英]Extract Ethernet, IP header, TCP and payload from socket recv Python

How can I extract Extract Ethernet, IP header, TCP and payload from socket.recv in Python Right now I can obtain information above using socket.recvfrom() : 如何从Python中的socket.recv中提取以太网,IP标头,TCP和有效载荷现在,我可以使用socket.recvfrom()获得以上信息:

    packet = s.recvfrom(NETWORK_MAX_SIZE)
    packet = packet[0] 
    #parse ethernet header
    eth_length = 14
    eth_header = packet[:eth_length]
    eth = unpack('!6s6sH' , eth_header)
    eth_protocol = socket.ntohs(eth[2])
    t = iph_length + eth_length
    tcp_header = packet[t:t+20]
    #now unpack them :)
    tcph = unpack('!HHLLBBHHH' , tcp_header)
    source_port = tcph[0]
    dest_port = tcph[1]
    sequence = tcph[2]
    acknowledgement = tcph[3]
    doff_reserved = tcph[4]
    tcph_length = doff_reserved >> 4
    h_size = eth_length + iph_length + tcph_length * 4
    data_size = len(packet) - h_size
    #get data from the packet
    data = packet[h_size:] 

Reference: http://www.binarytides.com/python-packet-sniffer-code-linux/ 参考: http : //www.binarytides.com/python-packet-sniffer-code-linux/

When I use same function by a fragmented TCP packet and call socket.recv() I get errors when unpacking tcpheader. 当我通过碎片化的TCP数据包使用相同的功能并调用socket.recv()时,解包tcpheader时会出错。

Thanks 谢谢

Thanks I recognized that socket.recv() returns a type str and socket.recvfrom() returns a tuple type, hence for socket.recv() I omitted packet = packet[0]. 谢谢,我认识到socket.recv()返回str类型, socket.recvfrom()返回元组类型,因此对于socket.recv()我省略了packet = packet [0]。 I will update code to handle TCP header to be variable. 我将更新代码以将TCP标头处理为可变的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM