将6字节IP /端口字符串解析为c中的in_addr结构

时间:2016-08-26 08:54:40

标签: c parsing bittorrent

我试图建立一个小的bittorrent客户端来存储bittorrent dht中的数据。 由于不需要大部分的bittorrent功能,我试图保持尽可能简单,因为它只需要在几个有限的用例中运行。

我试图从消息中解析有关新节点的信息,这是从引导节点获取的。每个节点的信息长度为26个字节。 20字节是节点ID,4字节IP地址和2字节端口号。所有信息都是二进制的。 我想将ip地址和端口号存储在一个struct(myNode)中,该结构有一个IP的in_addr参数和端口的unsinged short。

typedef struct myNode {
   unsigned char id[21];
   struct in_addr ip;
   unsigned short port;
} myNode;

解析ID工作正常。但解析IP和端口失败。有时它起作用,大多数情况下它不起作用,而且从不同时起作用。我认为我所做的按位转换可能有问题,但我不知道是什么。当我在解析后以十六进制打印IP时,我大多得到这样的东西:

  

0xffffed3a

所以看起来第一次轮班不起作用。其他位是正确的。我做错了什么?

int get_nodes_from_find_node(char *msg, myNode *setme) {
  char *fnstr = "nodes";
  char *pos, *ptr;
  long lenNodes;
  int nrNodes, i = 0, k = 0;

  pos = strstr(msg, fnstr);           // Find nodes section.
  if(pos == NULL) { return -1; }
  pos += strlen(fnstr);

  lenNodes = strtoul(pos, &ptr, 10);  // Save the length of the nodes section in lenNodes
  nrNodes = lenNodes / 26;            // Get number of nodes, about which info is delivered.
  pos = ptr+1;                        // Set pos to first node.

  while(nrNodes > 0) {
    for(k=0;k<20;k++,pos++) {       // First 20 bytes are ID.
        setme[i].id[k] = *pos;
    }
    setme[i].id[20] = '\0';         // Make ID a Null-terminated string.

    setme[i].ip.s_addr = (*pos << 24) | (*(pos+1) << 16) | (*(pos+2) << 8) | *(pos+3);   // Next 4 bytes are IP in network byte order.
    pos += 4;

    setme[i].port = (*pos << 8) | *(pos+1);  // Last 2 bytes are port.
    pos += 2;

    nrNodes--;
    i++;
  }     
  return 0;
}

1 个答案:

答案 0 :(得分:0)

您的问题出在(*pos << 24) | (*(pos+1) << 16) | (*(pos+2) << 8) | *(pos+3)

如果pos[0,...,3]中的任何值为负数,则整个表达式为负数。