ping实现

作者: HHFCodeRv | 来源:发表于2016-09-05 14:07 被阅读0次
    ping
    最近手头有点工作跟这个有段, 就实现一个简单ping. 不需要像源码那么详细. 就实现如图功能就行.

    先说下原理:

    1. 使用ICMP协议, 组织ICMP

      socket_id = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
      告诉host我们要使用发送的报文是ICMP, 至于怎么发, 以及TCP通信的就是不是我们这里要关心的了

    2. 组织ICMP标示

    p_icmp = (struct icmp *)buffer;
    p_icmp->icmp_type = ICMP_ECHO;
    p_icmp->icmp_code = 0;
    p_icmp->icmp_cksum = 0;
    p_icmp->icmp_seq = 12345;
    p_icmp->icmp_id = getpid();
    p_icmp->icmp_cksum = checkSum((uint16_t*)p_icmp, 64);
    这里组织我们需要的ICMP的一些标示

    1. 发送ICMP给host

    int send_chars = sendto(socket_id, (char *)buffer, 64, 0, (struct sockaddr*) &to, (socklen_t) sizeof(struct sockaddr_in));
    发送ICMP包给你host

    1. 等待hostICMP响应包

    int res = select(socket_id+1, &rfds, NULL, NULL, &tv);
    receive_bytes = recvfrom(socket_id, packet, 1024, 0, (struct sockaddr *)&from, &fromlen)
    等待host的响应

    基本上这样一个简单的PING就可以了, 至于TCP之间的如何通信问题, 请查看SOCKET通信的相关资料

    详细代码请查看我的github

    参考文档:
    https://www.cs.utah.edu/~swalton/listings/sockets/programs/part4/chap18/ping.c

    相关文章

      网友评论

        本文标题:ping实现

        本文链接:https://www.haomeiwen.com/subject/wjfkettx.html