2016-04-18 14 views
0

Ich habe schreiben Code wie unten und es wird verwendet, um Anwendungsdaten von Rohsocke, aber ich bekomme chaotischen Code.Daten wurden Anwendung mit rohen Socke ist chaotisch Code?

#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; 
} 

Zuerst habe ich ein Server-Programm und ein clinet Programm ausführen, wenn ich es laufen, zeigen Sie sie als Gebrüll: enter image description here

Warum das Ergebnis von Daten ist etwas chaotisch Code? Und wie man es repariert?

+0

Was würden Sie hier erwarten? Es ist eine Darstellung einiger binärer Daten. –

+0

@EugeneSh. Ich möchte Anwendungsdaten des Pakets erhalten, die Daten sind Zeichen. –

Antwort

1

Wenn die Daten auszudrucken, vorausgesetzt, dass Sie die temp_data-> str ein normaler ASCII-String ist

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

so etwas wie dieses Versuchen (Sie brauchen Länge passieren in analyData, und berechnen Sie die Ergebnislänge):

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