2013-10-10 30 views
0

我想弄清楚IP包使用原始套接字包含什么。我正在写在C++,到目前为止,我已经能够使用下面的代码打印出整个包:读取原始套接字IP标头? C++

int CreateRawSocket(int protocol_to_sniff) 
{ 
    int s 
    if(s = socket(PF_PACKET, SOCK_RAW, htons(protocol_to_sniff) 
    { 
      perror("Error creating raw socket"); 
      exit(1); 
    } 
    return s; 
} 

void PrintPacket(unsigned char *packet, int len) 
{ 
    unsigned char *p = packet; 

    printf("\n--Packet start--\n"); 
    while(len--) 
    { 
      printf("%.2x ", *p); 
      p++; 
    } 
    printf("\n--Packet end--\n"); 
} 

int main() 
{ 
    int length, s, packets_to_sniff; 
    unsigned char *packet_buffer; 

    s = CreateRawSocket(ETH_P_ALL); 

    if(s == -1) 
    { 
      perror("Error creating socket"); 
      exit(1); 
    } 

    packet_buffer = (unsigned char *)malloc(1518); 

    printf("Number of packets to sniff?: "); 
    cin >> packets_to_sniff; 

    while(packets_to_sniff--) 
    { 
      length = recvfrom(s, packet_buffer, ETH_FRAME_LEN, 0, NULL, NULL); 
      if(length == -1) 
      { 
       perror("Error recieving packet"); 
       exit(1); 
      } 
      else 
      { 
       printf("Packet number: " + packets_to_sniff); 
       PrintPacket(packet_buffer, length); 
      } 
    } 
} 

我有一个虚拟机查验一个我在编程上我所有的计划似乎打印是我认为是十六进制数据包的MAC帧..

我想能够读取IP标头,并找出哪些领域的标题包含什么信息。

东西有点像:

printf(packet_buffer[0]); 
printf(packet_buffer[1]); 

我已经试过了没有得到这似乎奇怪的任何输出。

最好的问候!

回答

1

你知道IP报头的大小,你可以打印每个字节为十六进制:

for (int i = 0; i < ip_header_length; i++) 
    printf("%02x ", packet_buffer[i]); 
+0

IP标题的大小是多少? – Zeliax

+0

http://en.wikipedia.org/wiki/IPv4#Header – tristan

+0

非常感谢!这帮了我很多,比我一开始就想到的要多! – Zeliax

0

您是否尝试过在十六进制中转储packet_buffer的内容,而不是将其视为由可打印字符组成的字符串?

+0

我不太清楚你的意思? – Zeliax