• uip源码剖析【三】——【网络层】ICMP解读


    ===================转载请保留头部====================

    作者:souroot   来源:WEB DNA

    连接:http://www.cnblogs.com/souroot/archive/2013/05/04/3059996.html

    关键词:TCPIP UIP 51单片机 计算机网络 网络工程专业 手把手教你写tcpip协议栈

    版权:  Q college 版权所有

    =====================以下为正文=====================

    先给个PC ping通单片机的效果图:

    单片机ip地址:192.168.0.123

    网关地址:192.168.0.1

    背后的图片是串口连接的单片机,单片机收到ICMP请求后,会发送ICMP应答,我们在此在串口打印"This is STC51. We send ICMP reply!"

    ==============IP + ICMP报文结构体============

         只对 ICMP request(echo) 进行响应,其他ICMP报文全部丢弃:

    1   /* ICMP echo (i.e., ping) processing. This is simple, we only change
    2      the ICMP type from ECHO to ECHO_REPLY and adjust the ICMP
    3      checksum before we return the packet. */
    4   if(ICMPBUF->type != ICMP_ECHO) {
    5     UIP_STAT(++uip_stat.icmp.drop);
    6     UIP_STAT(++uip_stat.icmp.typeerr);
    7     UIP_LOG("icmp: not icmp echo.");
    8     goto drop;
    9   }

      然后做三件事:把ICMP报文类型改成ICMP应答,修改ICMP校验和,互换目的IP和源IP,就可以发送出去了:

     1   ICMPBUF->type = ICMP_ECHO_REPLY;    /* 把报文改成ICMP应答(reply) */
     2 
     3   /* 修改校验和 */
     4   if(ICMPBUF->icmpchksum >= HTONS(0xffff - (ICMP_ECHO << 8))) {
     5     ICMPBUF->icmpchksum += HTONS(ICMP_ECHO << 8) + 1;
     6   } else {
     7     ICMPBUF->icmpchksum += HTONS(ICMP_ECHO << 8);
     8   }
     9   
    10   /* Swap IP addresses. */
    11   tmp16 = BUF->destipaddr[0];
    12   BUF->destipaddr[0] = BUF->srcipaddr[0];
    13   BUF->srcipaddr[0] = tmp16;
    14   tmp16 = BUF->destipaddr[1];
    15   BUF->destipaddr[1] = BUF->srcipaddr[1];
    16   BUF->srcipaddr[1] = tmp16;
    17 
    18   UIP_STAT(++uip_stat.icmp.sent);
    19   
    20   goto send;
  • 相关阅读:
    未进入Kali Linux系统修改修改密码的方法
    关于kali linux系统的简单工具
    PowerDesigner根据SQL文件生成PDM数据字典
    Oralce Plsql 中文显示乱码问题无需修改注册表完美解决
    自已写的一个简单图片展示功能,只有前后翻页和旋转
    详解百度地图创建地图、定位、标签、距离、驾车路线、跳动动画的标注代码示例
    div靠右浮动案例
    Struts2 XML配置详解
    log4j输出模板
    log4j日志配置详解
  • 原文地址:https://www.cnblogs.com/souroot/p/3059996.html
Copyright © 2020-2023  润新知