当前位置:  技术问答>linux和unix

ping

    来源: 互联网  发布时间:2016-06-06

    本文导语:  #include "ping.h" int datalen=64; struct proto proto_v4={proc_v4,send_v4,NULL,NULL,0,IPPROTO_ICMP}; int main(int argc,char *argv[]) { struct addrinfo *ai; char *h; signal(SIGALRM,sig_alrm); ai=host_serv(argv[1],NULL,0,0); h=ntop(ai->ai_addr,ai->ai_addrlen); print...


#include "ping.h"



int datalen=64;
struct proto proto_v4={proc_v4,send_v4,NULL,NULL,0,IPPROTO_ICMP};



int main(int argc,char *argv[])

{



struct addrinfo *ai;

char *h;



signal(SIGALRM,sig_alrm);



ai=host_serv(argv[1],NULL,0,0);
h=ntop(ai->ai_addr,ai->ai_addrlen);

printf("ping %s(%s):%d bytesn",ai->ai_canonname,h,datalen);


pr=&proto_v4;

pr->sasend=ai->ai_addr;

pr->sarecv=calloc(1,ai->ai_addrlen);

pr->salen=ai->ai_addrlen;





readloop();



return(0);

}



void readloop(void)

{

int n;

char recvbuf[1500];

sockfd=socket(pr->sasend->sa_family,SOCK_RAW,pr->icmpproto);



sig_alrm(SIGALRM);





for(;;)

{



n=recvfrom(sockfd,recvbuf,1500,0,pr->sarecv,NULL);

if(nfproc)(recvbuf,n);

}

}



void proc_v4(char *ptr,int len)

{

int hlen1,icmplen;

struct ip *ip;

struct icmp *icmp;

char addr[100];



ip=(struct ip *)ptr;

hlen1=(ip->ip_hl)*4;

if(ip->ip_p!=IPPROTO_ICMP)

return;

icmplen=len-hlen1;

icmp=(struct icmp *)(ptr+hlen1);



printf("%d bytes from %s:type=%d,code=%dn",icmplen,ntop(pr->sarecv,pr->salen),icmp->icmp_type,icmp->icmp_code);

}



void sig_alrm(int signo)

{

(*pr->fsend)();

alarm(1);

return;

}



void send_v4(void)

{

struct icmp *icmp;

char sendbuf[1500];



icmp=(struct icmp *)sendbuf;

icmp->icmp_type=ICMP_ECHO;

icmp->icmp_code=0;

icmp->icmp_id=getpid();

icmp->icmp_seq=nsent++;
icmp->icmp_cksum=0;
memset(icmp->icmp_data,'E',datalen);



sendto(sockfd,sendbuf,datalen,0,pr->sasend,pr->salen);

}
ping.h:
void proc_v4(char *,int);

void send_v4(void);

void readloop(void);

void sig_alrm(int);

struct proto

{

void (*fproc)(char *,int);

void (*fsend)(void);

struct sockaddr *sasend;

struct sockaddr *sarecv;

int salen;

int icmpproto;

} *pr;



int nsent;

int sockfd;


自己做了个ping程序,但是总是无法收到icmp回复,调试了很久,不知道为什么,拜托大家帮忙看看,谢谢了.

|


SOCK_RAW貌似是要自己写的

|
用tcpdump比较一下你发的包和实际用ping包在接收端有什么不同?

|
貌似你发送时连 ip 头部都没有填哇,有没有发出去到网络呢?

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3