转的代码

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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12378643/viewspace-619915/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12378643/viewspace-619915/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值