当前位置: 技术问答>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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。