Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 复制通过网络接收的数据(数据包有效负载)_C_String_Network Programming - Fatal编程技术网

C 复制通过网络接收的数据(数据包有效负载)

C 复制通过网络接收的数据(数据包有效负载),c,string,network-programming,C,String,Network Programming,我有一个通过网络接收数据包的应用程序。我能够解释除有效载荷(数据)部分之外的所有字段值 考虑数据包结构: src地址| src端口| dest地址| dest端口|数据|校验和 数据包本身存储为char*,我可以得到src/des addr,port的所有值。但有效载荷部分让我困惑。我可以用十六进制格式打印,但用字符打印会得到非ascii值。当我将有效负载部分复制到一个新字符串并打印新字符串时,我什么也得不到,即它不打印任何内容,其长度为0。我没有收到任何错误或警告。有人能告诉我哪里出了问题吗?

我有一个通过网络接收数据包的应用程序。我能够解释除有效载荷(数据)部分之外的所有字段值

考虑数据包结构: src地址| src端口| dest地址| dest端口|数据|校验和

数据包本身存储为char*,我可以得到src/des addr,port的所有值。但有效载荷部分让我困惑。我可以用十六进制格式打印,但用字符打印会得到非ascii值。当我将有效负载部分复制到一个新字符串并打印新字符串时,我什么也得不到,即它不打印任何内容,其长度为0。我没有收到任何错误或警告。有人能告诉我哪里出了问题吗?我想我遗漏了什么

以下是代码部分:

  typedef struct pcap_802_15_4_s{
   guint16 fcf;
   unsigned char seqno;
   guint16 dpan;
   guint16 daddr;
   guint16 saddr;
   char *payload_data;  
  } pcap_802_15_4_t;


char *packet = read_serial_packet(src, &len);


      if (!packet)
    exit(0);
      else if (packet[0] != TOS_SERIAL_802_15_4_ID) {
    printf("bad packet (serial type is %02x, not %02x)\n", packet[0], TOS_SERIAL_802_15_4_ID);
      }

      plen = packet[1];
      printf("Received packet of length %i: \n", plen);
      if (plen != len) {
    printf("Packet format error: read packet length (%hhx) is different than expected from frame (%hhx).\n", plen, len);
      }

      struct timeval tv;    
      gettimeofday(&tv, NULL);


      i = 2;
      // Read in FCF and i+=2
      fcf = packet[i+1] << 8 | packet[i];
      packet_802_15_4.fcf = fcf;
      i += 2;


      {
    if ((fcf & 0x7) == 0x01) {
      printf("  Frame type: data\n");
    }
    else if ((fcf & 0x7) == 0x02) {
      printf("  Frame type: acknowledgement\n");
    }
    else {
      printf("  Frame type: other\n");
    }

    printf("  Security: %s\n", (fcf & (1 << 3)) ? "enabled":"disabled");
    printf("  Frame pending: %s\n", (fcf & (1 << 4)) ? "yes":"no");
    printf("  Ack request: %s\n", (fcf & (1 << 5)) ? "yes":"no");
    printf("  Intra-PAN: %s\n", (fcf & (1 << 6)) ? "yes":"no");
    intraPan = (fcf & (1 << 6));
      }


      {
    unsigned char seqno = packet[i++];
    packet_802_15_4.seqno = seqno;
    printf("  Sequence number: 0x%hhx\n", seqno);
    printf("  Sequence number(dump): 0x%hhx\n", packet_802_15_4.seqno);

      }

      {
    char addrLen = (fcf >> 10) & 0x3;
    short saddr = 0;
    long long laddr = 0;

    // 16- and 64-bit destinations have a PAN ID
    if (addrLen == 2 || addrLen == 3) { 
      short destPan = packet[i++] << 8 | packet[i++];
      packet_802_15_4.dpan = destPan;
      printf("  Destination PAN: 0x%02hx\n", destPan);
      printf("  Destination PAN (dump): 0x%02hx\n", packet_802_15_4.dpan);
    }

    switch (addrLen) {
    case 0:
      printf("  Destination address: none\n");
      break;
    case 1:
      printf("  Destination address: invalid? (0x01)\n");
      break;
    case 2:
      saddr =  (packet[i] << 8 | packet[i+1]);
      i += 2;
      packet_802_15_4.daddr = saddr;
      printf("  Destination address: 0x%04hx\n", saddr);
      printf("  case 2: Destination address(dump): 0x%04hx\n", packet_802_15_4.daddr);
      break;
    case 3: {
      int j;
      for (j = 0; j < 8; j++) {
        laddr = laddr << 8;
        laddr |= packet[i++];
      }
      packet_802_15_4.daddr = saddr;
      printf("  Destination address: 0x%016llx\n", laddr);
      printf("  case 3: Destination address(dump): 0x%016llx\n", (long long unsigned int)packet_802_15_4.daddr);
      break;
    }
    default:
      printf("  Destination address: parse serror\n");
    }
      }


      {
    char addrLen = (fcf >> 14) & 0x3;
    short saddr = 0;
    long long laddr = 0;

    if (!intraPan) { // Intra-PAN packet
      short srcPan = packet[i] << 8 | packet[i+1];
      //packet_802_15_4.span = srcPan;
      i += 2;
      printf("  Source PAN: 0x%02hx\n", srcPan);
    }

    switch (addrLen) {
    case 0:
      printf("  Source address: none\n");
      break;
    case 1:
      printf("  Source address: invalid? (0x01)\n");
      break;
    case 2:
      saddr =  (packet[i] << 8 | packet[i + 1]);
      packet_802_15_4.saddr = saddr;
      i += 2;
      printf("  case(2): Source address: 0x%04hx\n", saddr);
      break;
    case 3: {
      int j;
      for (j = 0; j < 8; j++) {
        laddr = laddr << 8;
        laddr |= packet[i++];
      }
      printf("  case(3): Source address: 0x%016llx\n", laddr);
      packet_802_15_4.saddr = saddr;
      break;
    }
    default:
      printf("  Source address: parse serror\n");
    }
      }

      if (iframes) {
    printf("  I-Frame: %s\n", (packet[i++] == 0x3f)? "yes":"no");
      }

      printf("  AM type: 0x%02hhx\n", packet[i++]);

      if (i >= plen) {
    printf("Packet format error: read packet is shorter than expected.\n");
      }
      else {
        int j=0;
    packet_802_15_4.payload_data = (char *)malloc(sizeof(char) * (plen - i));
    for (; i < plen; i++) {
      printf("Payload byte %d: 0x%02hhx \n",i,packet[i]);
      printf("Payload byte %d: %c \n",i,packet[i]);
      packet_802_15_4.payload_data[j] = (char) packet[i];
      j++;  
    }
typedef结构pcap\u 802\u 15\u 4\s{
16立方英尺;
无符号字符序列号;
金氏16-dpan;
金16;
guint16 saddr;
char*payload_数据;
}pcap_802_15_4_t;
char*packet=读取串行数据包(src和len);
如果(!数据包)
出口(0);
else if(数据包[0]!=TOS\U串行\U 802\U 15\U 4\U ID){
printf(“坏数据包(串行类型为%02x,而不是%02x)\n”,数据包[0],TOS\u串行\u 802\u 15\u 4\u ID);
}
plen=数据包[1];
printf(“收到的数据包长度为%i:\n”,plen);
如果(全速!=len){
printf(“数据包格式错误:读取数据包长度(%hhx)与帧(%hhx)的预期长度不同。\n”,plen,len);
}
结构时间值电视;
gettimeofday(&tv,NULL);
i=2;
//以FCF读取,i+=2
fcf=packet[i+1]1)如果你有一个Wireshark,捕获几个包并检查那里的有效负载表示。如果Wireshark正确显示了有效负载,那么代码的接收器部分肯定有问题

2) 您确定没有任何IP标头或TCP标头吗?您正在传输原始以太网吗


3) 您确定负载只不过是字符吗?

听起来您试图将负载视为字符串,而它可能是二进制数据。您的十六进制版本的有效负载是什么样子的?十六进制的有效负载:0x00 0x01 0x10 0xDD您希望有效负载是什么?它是一个计数器,每个数据包的值都会递增。听起来试图用%c打印值毫无意义。这不是IP数据包。这是IEEE 802.15.4,数据包结构比较粗糙。我修改了一些字段以保持其简单性。您是否可以有一个始终传输相同字符串+所有0填充的场景?因此,如果您在解析数据包时遇到错误,您可以通过匹配ascii来解决索引+偏移量问题?假设您发送的是所有字符“AAAAA”+零填充,那么您必须看到0x41 0x41 0x41 0x41…而且Wireshark不会在TinyOS 802.15.4帧中解析Am抽象层。我不认为有任何索引问题,因为所有字段都是固定长度(1字节)的值,除了地址的长度是2字节。此外,正在发送的负载大小是恒定的(4字节)。然后,如果不了解它是如何序列化的,或者您是如何解析负载的,就很难继续我们所拥有的。