Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C (http://www.go4expert.com/forums/c/)
-   -   Help WITH PING PROGRAM (http://www.go4expert.com/forums/help-ping-program-t21551/)

en_7123 28Mar2010 00:54

Help WITH PING PROGRAM
 
Hi this is a simple program that sends an echo request and recieves an echo reply.The problem is in the recieved packet

Code:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <linux/ip.h>
#include <linux/icmp.h>
#include <string.h>
#include <unistd.h>

unsigned short in_cksum(unsigned short *, int);
int main()
{
int addrlen;

char d_addr[17];
struct iphdr *ip;
struct icmphdr *icmp;
struct iphdr *ipreply;
char *packet;
char *buffer;
int raw;
char *n;
struct sockaddr_in serv;
int optval=1;
int sent;

printf("Enter the destination address : ");
fgets(d_addr,17,stdin);

n= strchr(d_addr, '\n'); /* search for newline character */

if ( n != NULL )

{

*n = '\0'; /* overwrite trailing newline */

}


// Allocate space

packet=malloc(sizeof(struct iphdr)+sizeof(struct icmphdr));
buffer=malloc(sizeof(struct iphdr)+sizeof(struct icmphdr));


//setting up the ip header

ip=(struct iphdr *)packet;

//Setting the values for the ip header

ip->ihl=5;  //header length
ip->version=4; //version
ip->tos=0;    //type of service
ip->tot_len=sizeof(struct iphdr)+sizeof(struct icmphdr); //toatal length
ip->id=htons(random()); //Assign id as a random number
ip->ttl=255; //time to live;
ip->protocol=IPPROTO_ICMP;//ICMP header follow next to the ip header
ip->check=0; //Assign checksum as zero for now
ip->saddr=    INADDR_ANY;
ip->daddr=inet_addr(d_addr);

//Creating a raw socket

if((raw=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP))==-1)
{
perror("Something wrong with socket call :");
}

//setting the iphdrincl option

setsockopt(raw, IPPROTO_IP, IP_HDRINCL, &optval, sizeof(int));
 
//creating the icmp header
icmp=(struct icmphdr *)(packet+sizeof(struct iphdr));

icmp->type=ICMP_ECHO;       
icmp->code        = 0;
    icmp->un.echo.id        = 0;
    icmp->un.echo.sequence    = 0;
    icmp->checksum        = 0;
    icmp-> checksum        = in_cksum((unsigned short *)icmp, sizeof(struct icmphdr));
   
    ip->check            = in_cksum((unsigned short *)ip, sizeof(struct iphdr));

serv.sin_family=AF_INET;
serv.sin_addr.s_addr=ip->daddr;

sent=sendto(raw,packet,sizeof(packet),0,(struct sockaddr *)&serv,sizeof(struct sockaddr));



 /*
    *listen for response
    */
    addrlen = sizeof(serv);
    if (recvfrom(raw, buffer, sizeof(packet), 0, (struct sockaddr *)&serv, &addrlen) == -1)
    {
    perror("recv");
    }
    else
    {
    printf("Received %d byte reply from:\n", sizeof(buffer));
        ipreply = (struct iphdr*) buffer;
    printf("ID: %d\n", ntohs(ipreply->id));
    printf("TTL: %d\n", ipreply->ttl);
       
}
    close(raw);
    free(packet);
    return 0;



}
/*
 * in_cksum --
 * Checksum routine for Internet Protocol
 * family headers (C Version)
 */

unsigned short in_cksum(unsigned short *addr, int len)
{
    register int sum = 0;
    u_short answer = 0;
    register u_short *w = addr;
    register int nleft = len;
    /*
    * Our algorithm is simple, using a 32 bit accumulator (sum), we add
    * sequential 16 bit words to it, and at the end, fold back all the
    * carry bits from the top 16 bits into the lower 16 bits.
    */
    while (nleft > 1)
    {
      sum += *w++;
      nleft -= 2;
    }
    /* mop up an odd byte, if necessary */
    if (nleft == 1)
    {
      *(u_char *) (&answer) = *(u_char *) w;
      sum += answer;
    }
    /* add back carry outs from top 16 bits to low 16 bits */
    sum = (sum >> 16) + (sum & 0xffff);        /* add hi 16 to low 16 */
    sum += (sum >> 16);                /* add carry */
    answer = ~sum;                /* truncate to 16 bits */
    return (answer);
}

HERE IS THE OUTPUT
Enter the destination address : 209.85.231.104(ip of google)
Received 4 byte reply from:
ID: 0
TTL: 0

What is going wrong.Thanks


All times are GMT +5.5. The time now is 18:14.