当前位置: 技术问答>linux和unix
关于ping程序的问题
来源: 互联网 发布时间:2016-08-20
本文导语: 我写了一个简单的ping程序,代码如下: #include #include #include #include #include #include #include #include #include #include #include #include #include void sigalrm_handler(int); //通过对alarm信号响应发送icmp数据包 void se...
我写了一个简单的ping程序,代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
void sigalrm_handler(int); //通过对alarm信号响应发送icmp数据包
void send_icmp(void);
void recv_icmp(void);
void tvsub(struct timeval *,struct timeval *); //calculate the transmission time
unsigned short in_cksum(); //calculate the confirmation code
void pr_icmp(char *ptr,int len);
int sockfd;
int pid; //用于设置icmp的id
int datalen=56; //用于设置icmp数据包的打消
char hostname[128];
struct sockaddr_in dest;
char sendbuf[256];
int seq=0; //用于设置下一个icmp数据包的序列号
int main(int argc,char * argv[])
{
struct sigaction act;
struct hostent *he;
int n;
if(argc!=2)
{
fprintf(stderr,"usage:ping hostn");
exit(1);
}
act.sa_handler=sigalrm_handler;
sigemptyset(&act.sa_mask);
act.sa_flags=0;
sigaction(SIGALRM,&act,NULL); //此函数用于检查或修改指定信号关联的处理动作
pid=getpid();
if(inet_aton(argv[1],&dest.sin_addr)==1) //若输入的是ip地址
{
strcpy(hostname,argv[1]);
}else{ //若输入的是域名
he=gethostbyname(argv[1]);
if(he!=NULL)
{
strcpy(hostname,he->h_name);
dest.sin_addr=*(struct in_addr*)he->h_addr_list[0];
}else{
fprintf(stderr,"host name error:%s %sn",argv[1],hstrerror(h_errno));
exit(1);
}
}
printf("PING %s(%s):n",hostname,inet_ntoa(dest.sin_addr));
sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP); //SOCK_RAW为原始套接字
if(sockfdtv_usec-=in->tv_usec)tv_sec--;
out->tv_usec+=1000000;
}
out->tv_sec-=in->tv_sec;
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
void sigalrm_handler(int); //通过对alarm信号响应发送icmp数据包
void send_icmp(void);
void recv_icmp(void);
void tvsub(struct timeval *,struct timeval *); //calculate the transmission time
unsigned short in_cksum(); //calculate the confirmation code
void pr_icmp(char *ptr,int len);
int sockfd;
int pid; //用于设置icmp的id
int datalen=56; //用于设置icmp数据包的打消
char hostname[128];
struct sockaddr_in dest;
char sendbuf[256];
int seq=0; //用于设置下一个icmp数据包的序列号
int main(int argc,char * argv[])
{
struct sigaction act;
struct hostent *he;
int n;
if(argc!=2)
{
fprintf(stderr,"usage:ping hostn");
exit(1);
}
act.sa_handler=sigalrm_handler;
sigemptyset(&act.sa_mask);
act.sa_flags=0;
sigaction(SIGALRM,&act,NULL); //此函数用于检查或修改指定信号关联的处理动作
pid=getpid();
if(inet_aton(argv[1],&dest.sin_addr)==1) //若输入的是ip地址
{
strcpy(hostname,argv[1]);
}else{ //若输入的是域名
he=gethostbyname(argv[1]);
if(he!=NULL)
{
strcpy(hostname,he->h_name);
dest.sin_addr=*(struct in_addr*)he->h_addr_list[0];
}else{
fprintf(stderr,"host name error:%s %sn",argv[1],hstrerror(h_errno));
exit(1);
}
}
printf("PING %s(%s):n",hostname,inet_ntoa(dest.sin_addr));
sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP); //SOCK_RAW为原始套接字
if(sockfdtv_usec-=in->tv_usec)tv_sec--;
out->tv_usec+=1000000;
}
out->tv_sec-=in->tv_sec;
}
|
忽略这个错误即可
while(1)
{
ret = recv(...)
if(ret == -1 && errno = EINTR)
continue;
}
|
blocking的recvfrom调用,被alarm信号打断了。
|
楼主的代码已经有这个的处理了阿,把printf拿掉,无视它即可
如果你说要不被打断的话,不幸得告诉你。。这是不可能的。
除非你去改linux内核
如果你说要不被打断的话,不幸得告诉你。。这是不可能的。
除非你去改linux内核