#define MAX_PACKET 1024
#define DEF_PACKET_SIZE 32
void recv_packet (int);
void send_packet (int);
void decode_resp (int,struct sockaddr_in *);
unsigned short checksum (unsigned short *,int);
static unsigned int saddr_value;
int datasize;
char * sendbuf;
char * recvbuf;
struct sockaddr_in dest_host;
#define ICMP_MIN 8 /* minimum 8 byte icmp packet (just header ) */
#define ICMP_ECHO 8
#define ICMP_ECHOREPLY 0
typedef struct iphdr
{
unsigned int h_len:4; /* length of the header */
unsigned int version:4; /* Version of IP */
unsigned char tos; /* Type of service */
unsigned short total_len; /* total length of the packet */
unsigned short ident; /* unique identifier */
unsigned short frag_and_flags; /* flags */
unsigned char ttl;
unsigned char proto; /* protocol (TCP, UDP etc ) */
unsigned short checksum; /* IP checksum */
unsigned long sourceIP;
unsigned long destIP;
}IpHeader;
typedef struct _ihdr
{
unsigned char i_type;
unsigned char i_code; /* type sub code */
unsigned short int i_cksum;
unsigned short i_id;
unsigned short i_seq;
unsigned long int timestamp; /* Thi's not the std hdr, but we reserve space for time */
}IcmpHeader;
void main(void)
{
int rval;
int fun_rval;
struct timeval timeout;
int socketid;
char * datapart;
timeout.tv_sec = 0;
timeout.tv_usec = 0;
saddr_value=inet_addr("172.16.160.34" ;
dest_host.sin_family = AF_INET;
dest_host.sin_addr.s_addr = saddr_value;
printf(" inging %s .\n",inet_ntoa (dest_host.sin_addr));
sendbuf = malloc (MAX_PACKET );
recvbuf = malloc (MAX_PACKET );
datasize = DEF_PACKET_SIZE;
datasize += sizeof (IcmpHeader );
IcmpHeader * icmp_hdr;
memset (sendbuf,0,MAX_PACKET );
icmp_hdr = (IcmpHeader * )sendbuf;
icmp_hdr ->; i_type = ICMP_ECHO;
icmp_hdr ->; i_code = 0;
icmp_hdr ->; i_id = getpid ();
icmp_hdr ->; i_cksum = 0;
icmp_hdr ->; i_seq = 0;
datapart = sendbuf + sizeof (IcmpHeader );
memset (datapart,'a',datasize-sizeof (IcmpHeader ) );
((IcmpHeader* )sendbuf ) ->; i_cksum = 0;
/*
((IcmpHeader* )sendbuf ) ->; timestamp = GetTickCount () ;
*/
((IcmpHeader* )sendbuf ) ->; i_seq = 1;
((IcmpHeader* )sendbuf ) ->; i_cksum = checksum ((unsigned short * )sendbuf,datasize );
socketid = socket (AF_INET,SOCK_RAW,IPPROTO_ICMP);
rval = setsockopt (socketid,SOL_SOCKET,SO_RCVTIMEO, &timeout,sizeof (timeout ));
rval = setsockopt (socketid,SOL_SOCKET,SO_SNDTIMEO, &timeout,sizeof (timeout ));
send_packet (socketid);
recv_packet (socketid);
}
void send_packet (int socketid)
{
int rval;
int addr_len;
addr_len = sizeof (struct sockaddr_in);
while (1)
{
rval = sendto (socketid,sendbuf,datasize,0,(struct sockaddr* )&dest_host,addr_len);
if ((rval < 0)&&(errno == 4))
{
continue;
}
else if (rval < 0)
{
printf ("Detect_Conn_Packet_Send Failure\n" ;
break;
}
else
{
printf("Send Success.(%d)\n",rval);
break;
}
}
if (sendbuf != NULL)
free (sendbuf);
}
void recv_packet (int socketid)
{
int rval;
unsigned int fromlen;
struct sockaddr_in from;
fromlen = sizeof (struct sockaddr_in);
while (1)
{
printf("Begin recvfrom.\n" ;
rval = recvfrom (socketid,recvbuf,MAX_PACKET,0, (struct sockaddr* )&from,&fromlen );
if (rval == -1 &&errno == 4)
continue;
else if (rval < 0)
{
printf ("Detect_Conn_Packet_Recv Failure\n" ;
break;
}
else
{
printf("Receive Success.(%d)\n",rval);
break;
}
}
if (rval < 0 )
printf ("Detect_Conn_Packet_Recv Failure\n" ;
else
decode_resp (rval,&from );
if (recvbuf != NULL)
free (recvbuf);
}
void decode_resp (int bytes,struct sockaddr_in * from )
{
IpHeader * iphdr;
IcmpHeader * icmphdr;
unsigned short iphdrlen;
iphdr = (IpHeader * )recvbuf;
iphdrlen = iphdr ->; h_len*4; /* number of 32-bit words *4 = bytes */
if (bytes < iphdrlen + ICMP_MIN )
printf ("Detect_Conn_Recv_FewBytes from: %s\n",inet_ntoa (from ->; sin_addr ) );
icmphdr = (IcmpHeader * ) (recvbuf + iphdrlen );
if (icmphdr ->; i_type == 3)
printf ("Destination Unreachable!\n" ;
else if (icmphdr ->; i_type == 11)
printf ("Time out!\n" ;
else if (icmphdr ->; i_id != (unsigned short ) getpid () )
printf ("someone else's packet!\n" );
else
printf (" Reply from %s Success Ping!\n",inet_ntoa (from ->; sin_addr ) );
}
unsigned short checksum (unsigned short * buffer, int size )
{
unsigned long cksum = 0;
while (size >; 1 )
{
cksum += * buffer++;
size -= sizeof (unsigned short );
}
if (size )
cksum += * (unsigned char * )buffer;
cksum = (cksum >;>; 16 )+ (cksum & 0xffff );
cksum += (cksum >;>; 16 );
return (unsigned short )(~cksum );
}
#define DEF_PACKET_SIZE 32
void recv_packet (int);
void send_packet (int);
void decode_resp (int,struct sockaddr_in *);
unsigned short checksum (unsigned short *,int);
static unsigned int saddr_value;
int datasize;
char * sendbuf;
char * recvbuf;
struct sockaddr_in dest_host;
#define ICMP_MIN 8 /* minimum 8 byte icmp packet (just header ) */
#define ICMP_ECHO 8
#define ICMP_ECHOREPLY 0
typedef struct iphdr
{
unsigned int h_len:4; /* length of the header */
unsigned int version:4; /* Version of IP */
unsigned char tos; /* Type of service */
unsigned short total_len; /* total length of the packet */
unsigned short ident; /* unique identifier */
unsigned short frag_and_flags; /* flags */
unsigned char ttl;
unsigned char proto; /* protocol (TCP, UDP etc ) */
unsigned short checksum; /* IP checksum */
unsigned long sourceIP;
unsigned long destIP;
}IpHeader;
typedef struct _ihdr
{
unsigned char i_type;
unsigned char i_code; /* type sub code */
unsigned short int i_cksum;
unsigned short i_id;
unsigned short i_seq;
unsigned long int timestamp; /* Thi's not the std hdr, but we reserve space for time */
}IcmpHeader;
void main(void)
{
int rval;
int fun_rval;
struct timeval timeout;
int socketid;
char * datapart;
timeout.tv_sec = 0;
timeout.tv_usec = 0;
saddr_value=inet_addr("172.16.160.34" ;
dest_host.sin_family = AF_INET;
dest_host.sin_addr.s_addr = saddr_value;
printf(" inging %s .\n",inet_ntoa (dest_host.sin_addr));
sendbuf = malloc (MAX_PACKET );
recvbuf = malloc (MAX_PACKET );
datasize = DEF_PACKET_SIZE;
datasize += sizeof (IcmpHeader );
IcmpHeader * icmp_hdr;
memset (sendbuf,0,MAX_PACKET );
icmp_hdr = (IcmpHeader * )sendbuf;
icmp_hdr ->; i_type = ICMP_ECHO;
icmp_hdr ->; i_code = 0;
icmp_hdr ->; i_id = getpid ();
icmp_hdr ->; i_cksum = 0;
icmp_hdr ->; i_seq = 0;
datapart = sendbuf + sizeof (IcmpHeader );
memset (datapart,'a',datasize-sizeof (IcmpHeader ) );
((IcmpHeader* )sendbuf ) ->; i_cksum = 0;
/*
((IcmpHeader* )sendbuf ) ->; timestamp = GetTickCount () ;
*/
((IcmpHeader* )sendbuf ) ->; i_seq = 1;
((IcmpHeader* )sendbuf ) ->; i_cksum = checksum ((unsigned short * )sendbuf,datasize );
socketid = socket (AF_INET,SOCK_RAW,IPPROTO_ICMP);
rval = setsockopt (socketid,SOL_SOCKET,SO_RCVTIMEO, &timeout,sizeof (timeout ));
rval = setsockopt (socketid,SOL_SOCKET,SO_SNDTIMEO, &timeout,sizeof (timeout ));
send_packet (socketid);
recv_packet (socketid);
}
void send_packet (int socketid)
{
int rval;
int addr_len;
addr_len = sizeof (struct sockaddr_in);
while (1)
{
rval = sendto (socketid,sendbuf,datasize,0,(struct sockaddr* )&dest_host,addr_len);
if ((rval < 0)&&(errno == 4))
{
continue;
}
else if (rval < 0)
{
printf ("Detect_Conn_Packet_Send Failure\n" ;
break;
}
else
{
printf("Send Success.(%d)\n",rval);
break;
}
}
if (sendbuf != NULL)
free (sendbuf);
}
void recv_packet (int socketid)
{
int rval;
unsigned int fromlen;
struct sockaddr_in from;
fromlen = sizeof (struct sockaddr_in);
while (1)
{
printf("Begin recvfrom.\n" ;
rval = recvfrom (socketid,recvbuf,MAX_PACKET,0, (struct sockaddr* )&from,&fromlen );
if (rval == -1 &&errno == 4)
continue;
else if (rval < 0)
{
printf ("Detect_Conn_Packet_Recv Failure\n" ;
break;
}
else
{
printf("Receive Success.(%d)\n",rval);
break;
}
}
if (rval < 0 )
printf ("Detect_Conn_Packet_Recv Failure\n" ;
else
decode_resp (rval,&from );
if (recvbuf != NULL)
free (recvbuf);
}
void decode_resp (int bytes,struct sockaddr_in * from )
{
IpHeader * iphdr;
IcmpHeader * icmphdr;
unsigned short iphdrlen;
iphdr = (IpHeader * )recvbuf;
iphdrlen = iphdr ->; h_len*4; /* number of 32-bit words *4 = bytes */
if (bytes < iphdrlen + ICMP_MIN )
printf ("Detect_Conn_Recv_FewBytes from: %s\n",inet_ntoa (from ->; sin_addr ) );
icmphdr = (IcmpHeader * ) (recvbuf + iphdrlen );
if (icmphdr ->; i_type == 3)
printf ("Destination Unreachable!\n" ;
else if (icmphdr ->; i_type == 11)
printf ("Time out!\n" ;
else if (icmphdr ->; i_id != (unsigned short ) getpid () )
printf ("someone else's packet!\n" );
else
printf (" Reply from %s Success Ping!\n",inet_ntoa (from ->; sin_addr ) );
}
unsigned short checksum (unsigned short * buffer, int size )
{
unsigned long cksum = 0;
while (size >; 1 )
{
cksum += * buffer++;
size -= sizeof (unsigned short );
}
if (size )
cksum += * (unsigned char * )buffer;
cksum = (cksum >;>; 16 )+ (cksum & 0xffff );
cksum += (cksum >;>; 16 );
return (unsigned short )(~cksum );
}
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12378643/viewspace-619915/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/12378643/viewspace-619915/