我试图在Contiki中浏览此文件,发现很难理解目的是什么,以及为什么要使用这样的混淆代码?

我的婴儿床就是这部分

  return s(" ping",
     n(IPBUF->destipaddr[3], d(
     n(IPBUF->destipaddr[2], d(
     n(IPBUF->destipaddr[1], d(
     n(IPBUF->destipaddr[0],
         s(" ",
     n(IPBUF->srcipaddr[3], d(
     n(IPBUF->srcipaddr[2], d(
     n(IPBUF->srcipaddr[1], d(
         n(IPBUF->srcipaddr[0],
     buf)))))))))))))))) - buf;




/*---------------------------------------------------------------------------*/
static char *
s(char *str, char *ptr)
{
  strcpy(ptr, str);
  return ptr + strlen(str);
}
/*---------------------------------------------------------------------------*/
int
tcpdump_format(uint8_t *packet, uint16_t packetlen,
           char *buf, uint16_t buflen)
{
  char flags[8];
  if(IPBUF->proto == UIP_PROTO_ICMP) {
    if(ICMPBUF->type == ICMP_ECHO) {
      return s(" ping",
         n(IPBUF->destipaddr[3], d(
         n(IPBUF->destipaddr[2], d(
         n(IPBUF->destipaddr[1], d(
         n(IPBUF->destipaddr[0],
             s(" ",
         n(IPBUF->srcipaddr[3], d(
         n(IPBUF->srcipaddr[2], d(
         n(IPBUF->srcipaddr[1], d(
             n(IPBUF->srcipaddr[0],
         buf)))))))))))))))) - buf;

      /*      return sprintf(buf, "%d.%d.%d.%d %d.%d.%d.%d ping",
             IPBUF->srcipaddr[0], IPBUF->srcipaddr[1],
             IPBUF->srcipaddr[2], IPBUF->srcipaddr[3],
             IPBUF->destipaddr[0], IPBUF->destipaddr[1],
             IPBUF->destipaddr[2], IPBUF->destipaddr[3]);*/
    }


https://github.com/contiki-os/contiki/blob/master/tools/wpcapslip/tcpdump.c

注释部分告诉代码正在尝试执行的操作,但是为什么要这样做呢?

最佳答案

Contiki专为小型系统而设计,只有几千字节的可用内存。 (典型的具有全IPv6网络且具有睡眠路由器和RPL路由的系统需要的RAM少于10 kb,ROM少于30 kb。)由于操作系统需要占用一些内存,因此标准字符串库可能未在OS中使用。很小的嵌入式系统有时不使用标准库,并且在需要时具有自己的实现。

关于c - 了解Contiki中的tcpdump.c文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48704373/

10-10 19:24