Witam
Mam do napisania program podobny do tracerouta i nie bardzo wiem jak sie za to zarac, samemu wymyslilem cos taiego ale to z jakiegos powodu nie dziala, jak analizuje ruch sieciowy wiresharkiem, wysyla mi pakiec ale nie otrzymuje nic z powrotem
//#define __USE_BSD
#include <netinet/in.h>
#define __USE_BSD
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <cstdio>
#include <iostream>
using namespace std;
struct header {
struct ip iph;
struct icmphdr icmph;
};
unsigned short
csum (unsigned short *buf, int nwords)
{
unsigned long sum;
for (sum = 0; nwords > 0; nwords--)
sum += *buf++;
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
return sum;
}
int main(int argc,char * argv[]){
int sockfd = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP);
struct sockaddr_in dst, src;
dst.sin_addr.s_addr = inet_addr ("212.77.100.101");
dst.sin_port = 3000;
dst.sin_family = AF_INET;
struct header ipicmp;
ipicmp.iph.ip_hl = 5;
ipicmp.iph.ip_v = 4;
ipicmp.iph.ip_p = IPPROTO_ICMP;
ipicmp.iph.ip_tos = 0;
ipicmp.iph.ip_len = sizeof (struct header);
ipicmp.iph.ip_id = 0;
ipicmp.iph.ip_off = htons (IP_DF);
ipicmp.iph.ip_ttl = 1;
ipicmp.iph.ip_sum = 0;
ipicmp.iph.ip_src.s_addr = INADDR_ANY;
ipicmp.iph.ip_dst.s_addr = dst.sin_addr.s_addr;
ipicmp.icmph.type = ICMP_ECHO;
ipicmp.icmph.code = 0;
ipicmp.icmph.checksum = 0;
ipicmp.icmph.checksum = csum ((unsigned short *) &ipicmp.icmph, sizeof (ipicmp.icmph) >> 1);
ipicmp.iph.ip_sum = csum ((unsigned short *) &ipicmp.iph, sizeof (ipicmp) >> 1);
while(true){
sendto(sockfd, &ipicmp, sizeof(ipicmp),0 ,(struct sockaddr *)&dst, sizeof(struct sockaddr) );
struct header buf;
cout<<"1 "<<endl;
socklen_t len = sizeof (struct sockaddr);
recvfrom(sockfd,&buf,sizeof(buf),0,(struct sockaddr *)&src,&len);
cout<<"2 "<<endl;
if(buf.icmph.type==ICMP_ECHOREPLY){
cout<<"Znalazlem ttl: "<<ipicmp.iph.ip_ttl<<endl;
break;
}else{
cout<<"Nie trafilem jeszcze"<<endl;
ipicmp.iph.ip_ttl++;
ipicmp.icmph.checksum = csum ((unsigned short *) &ipicmp.icmph, sizeof (ipicmp.icmph) >> 1);
ipicmp.iph.ip_sum = csum ((unsigned short *) &ipicmp.iph, sizeof (ipicmp) >> 1);
}
}
return 0;
}
Z gory dziekuje za pomoc
Pozdrawiam