设为首页 加入收藏

TOP

Linux下的ping程序源代码(二)
2014-11-24 02:45:48 来源: 作者: 【 】 浏览:2
Tags:Linux ping 程序 源代码
cket->icmp_cksum = checksum((uint16_t *)packet, ICMPHEAD + 6);
int err = send(packet, MAXICMPLEN, host);
return err;


}



int ICMP:: recv_icmp(sockaddr *from)
{
char buf[MAXICMPLEN + 100];
int hlen1, icmplen;
struct ip *ip;
struct icmp *icmp;


if( Error() )
{
printf("Error() = %d\n", Error());
return -1;
}

socklen_t addrlen = 0;
int len = receive(buf, MAXICMPLEN+100, from , &addrlen);


if ( len == -1)
{
cout<<"Receive Failed\n";
return -1;
}


ip = (struct ip *)buf;
hlen1 = ip->ip_hl << 2;


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


if( (icmplen = len -hlen1) < 8)
{
cout<<"Receive Fail\n";
return -1;
}


memcpy(packet, icmp , icmplen);
// printf("11111\n");
return 0;
}



main(int argc, char *argv[])
{
ICMP icmp;
struct sockaddr from;
char *host;
int count;


if(argc < 2)
{
printf("can shu you wu\n");
exit(1);
}
if(argc == 2)
{
host = argv[1];
count = 5;
}
if( argc == 3)
{
host = argv[1];
count = 3;
}


for( int i=0; i<=count; i++)
{
icmp.setId(getpid());
icmp.setSeq(i);
char *test_data = "abcde";
icmp.send_icmp(host, test_data, strlen(test_data));
printf("count = %d\n", count);
}


int num = 1;
while(1)
{
if(icmp.recv_icmp(&from) < 0)
continue;
if(icmp.packet->icmp_type == ICMP_ECHOREPLY)
{
if( icmp.packet->icmp_id == getpid())
{
printf("%d bypes form %s: seq=%u, data=%s\n",
icmp.length, host, icmp.packet->icmp_seq, icmp.packet->icmp_data);
num++;
if(num > count)
break;
}


}
}
}


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Arch Linux快速配置Java环境变量 下一篇Java RMI的例子

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: