2016-04-18 16 views
0

我寫代碼如下,它被用來通過原始襪子獲取應用程序數據,但我得到了混亂的代碼。使用原始襪子得到的應用程序數據是凌亂的代碼?

#include<errno.h> 
#include<stdio.h> 
#include<unistd.h> 
#include<stdlib.h> 
#include<string.h> 
#include<memory.h> 
#include<sys/socket.h> //socket() 
#include<sys/ioctl.h> 
#include<net/ethernet.h> 
#include<net/if.h> 
#include<netinet/in.h> 
#include<netinet/ether.h> 
#include<netinet/ip.h> 
#include<netinet/tcp.h> 
#include<arpa/inet.h>//inet_ntoa() struct in_addr 

struct context{ 
    char str[1024]; 
}; 

int analyData(char *data) 
{ 
    struct iphdr *ip; 
    struct tcphdr *tcp; 
    struct ether_header *ehter; 
    struct context *temp_data; 

    ip = (struct iphdr *)data; 
    switch(ip->protocol) 
    { 
    case 6: 
    printf("Protocal ---- TCP Segment\n"); 
    break; 
    case 17: 
    printf("Protocal ---- UDP Segment\n"); 
    break; 
    case 1: 
    printf("Protocal ---- ICMP Segment\n"); 
    break; 
    default: 
    printf("Protocal ---- Unknown Segment\n"); 
    break; 
    } 
    printf("Source IP ---- %s\n", inet_ntoa(*((struct in_addr *)&ip->saddr))); 
    printf("Dest IP ---- %s\n", inet_ntoa(*((struct in_addr *)&ip->daddr))); 

    tcp = (struct tcphdr *) (data + sizeof(*ip));//結構體 
    printf("Source Port ---- %d\n", ntohs(tcp->source)); 
    printf("Dest Port ---- %d\n", ntohs(tcp->dest)); 
    temp_data = (struct context *)(data + sizeof(*ip) + sizeof(*tcp)); 
    printf("Data ---- %s\n", temp_data->str); 
    return 1; 
} 
int get_datagram(char argv[]) 
{ 
    unsigned char buffer[1024]; 
    struct sockaddr_in recvaddr; 
    int count = 0; 

    if(argv == NULL) 
    { 
    printf("please enter the ecterface!"); 
    return -1; 
    } 
    else if(strcmp(argv, "eth0") != 0) 
    { 
    printf("please enter the eth0!"); 
    return -1; 
    } 

    memset(buffer, 0, sizeof(buffer)); 

    int sock_raw_fd = socket(PF_INET , SOCK_RAW, IPPROTO_TCP); 
    if(sock_raw_fd < 0) 
    { 
    printf("created raw socket error:%s !!!\n", strerror(errno)); 
    exit(1); 
    } 
    else 
    printf("create raw socket %d sucess !!!\n", sock_raw_fd); 


    int recv_len = sizeof(struct sockaddr_in); 

    while(1) 
    { 
    int len = recvfrom(sock_raw_fd, buffer, sizeof(buffer), 0, (struct sockaddr *)&recvaddr, &recv_len); 
    if(len > 0) 
    { 
     printf("This packet get %d bytes !!!\n", strlen(buffer)); 
     analyData(buffer); 
     printf("Already get %d packet !!!\n", ++count); 
     printf("\n"); 
    } 
    } 
    close(sock_raw_fd); 
    return 0; 
} 

int main(int argc, char const *argv[]) { 
    get_datagram("eth0"); 
return 0; 
} 

起初我運行一個服務器程序和客戶爲例程序,當我運行它,它顯示爲波紋管: enter image description here

爲什麼數據的結果是亂碼?以及如何解決它?

+0

你會在這裏期待什麼?它是一些二進制數據的表示。 –

+0

@EugeneSh。我想獲取包的應用數據,數據是字符。 –

回答

1

當打印出的數據,你承擔temp_data-> str是一個正常的ASCII字符串

printf("Data ---- %s\n", temp_data->str); 

嘗試是這樣的(你需要傳遞長度爲analyData,並計算結果長度):

int i; 
for (i=0; i < length; i++) 
{ 
    printf("%02x", data[i]); 
} 
printf ("\n");