• 大小: 4KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-06-08
  • 语言: 其他
  • 标签: ping  linux  

资源简介

ping 程序的使用频率很高,常用于确定本机与网络中其它主机的网络通信。ping程序将发送数据包给指定计算机

资源截图

代码片段和文件信息

//p21.c 简单ping程序实现
#include 
#include 
#include 
 
#include 
#include 
#include 
#include 
#include 
#include 

#define BUFFER_SIZE 1024

u_short cal_cksum(const u_short *addr register int len u_short csum)
{
register int nleft = len;
const u_short *w = addr;
register u_short answer;
register int sum = csum;

/**  使用32位累加器实现校验码的计算
*  联系对16位数进行累加,最后将高16位与低16位进行累加
*/
while (nleft > 1)  {
sum += *w++;
nleft -= 2;
}

/* 如果最后剩余8位,补齐到16位(补零,同时注意网络字节与
主机字节间的转换) */
if (nleft == 1)
sum += htons(*(u_char *)w << 8);

/** 将高低16位相加,以消除累加时进位问题*/
sum = (sum >> 16) + (sum & 0xffff); /* 高低16位相加 */
sum += (sum >> 16); /* 消除高低位相加的进位问题 */
answer = ~sum; /* 取反 */
return (answer);

}

int
main(int argc char * argv[])
{
    int sock;
    struct sockaddr_in sin;
    unsigned short local_port;
    unsigned char protocol;
    char * buffer * buffer2 * dnsdata;
    struct iphdr * ip_header;
    struct icmphdr * icmp_header;
    char * remote_ip_str;
    unsigned short buffer_size buffer_size2;
    int tmp len;
    short randomseq;
 
    //判断参数是否符合程序运行要求
    if (argc != 3) {
        fprintf(stderr “USAGE: %s port destination\n“ argv[0]);
        return 1;
    }
 
    protocol = IPPROTO_ICMP;
 
    local_port = atoi(argv[1]);
    remote_ip_str = argv[2];

    //创建通信所需套接字,注意套接字类型为原始套接字
    if ((sock = socket(PF_INET SOCK_RAW protocol)) < 0) { 
        perror(“socket“);
        exit(1);
    }
    memset(& sin 0 sizeof(sin));
    sin.sin_port = htons(local_port);
 
    //完成套接字与端口、地址信息的绑定
    if ((bind(sock (struct sockaddr *)& sin sizeof(sin))) < 0) {
        perror(“bind“);
        ex

评论

共有 条评论