日期:2014-05-16  浏览次数:20790 次

linux下运行C程序的错误信息为 segmentation fault
我在运行用C写的ping代码出现segmentation   fault
原代码是
#include   <stdio.h>
#include   <stdlib.h>
#include   <memory.h>
#include   <signal.h>
#include   <arpa/inet.h>
#include   <sys/types.h>
#include   <sys/socket.h>
#include   <unistd.h>
#include   <netinet/in.h>
#include   <netinet/ip.h>
#include   <netinet/ip_icmp.h>
#include   <netdb.h>
#include   <setjmp.h>
#include   <errno.h>

#define   PACKET_SIZE           4096
#define   MAX_WAIT_TIME       5
#define   MAX_NO_PACKETS     3

char   sendpacket[PACKET_SIZE];
char   recvpacket[PACKET_SIZE];
int   sockfd,datalen=56;
int   nsend=0,nreceived=0;
struct   sockaddr_in   dest_addr;
pid_t   pid;
struct   sockaddr_in   from;
struct   timeval   tvrecv;

void   statistics(int   signo);
unsigned   short   cal_chksum(unsigned   short   *addr,int   len);
int   pack(int   pack_no);
void   send_packet(void);
void   recv_packet(void);
int   unpack(char   *buf,int   len);
void   tv_sub(struct   timeval   *out,struct   timeval   *in);

void   statistics(int   signo)
{               printf( "\n--------------------PING   statistics-------------------\n ");
                printf( "%d   packets   transmitted,   %d   received   ,   %%%d   lost\n ",nsend,nreceived,
                                                (nsend-nreceived)/nsend*100);
                close(sockfd);
                exit(1);
}
/*校验和算法*/
unsigned   short   cal_chksum(unsigned   short   *addr,int   len)
{               int   nleft=len;
                int   sum=0;
                unsigned   short   *w=addr;
                unsigned   short   answer=0;

/*把ICMP报头二进制数据以2字节为单位累加起来*/
                while(nleft> 1)
                {               sum+=*w++;
                                nleft-=2;
                }
/*若ICMP报头为奇数个字节,会剩下最后一字节。把最后一个字节视为一个2字节数据的高字节,这个2字节数据的低字节为0,继续累加*/
                if(   nleft==1)
                {               *(unsigned   char   *)(&answer)=*(unsigned   char   *)w;