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:
Warum das Ergebnis von Daten ist etwas chaotisch Code? Und wie man es repariert?
Was würden Sie hier erwarten? Es ist eine Darstellung einiger binärer Daten. –
@EugeneSh. Ich möchte Anwendungsdaten des Pakets erhalten, die Daten sind Zeichen. –