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

Parse 6-byte IP/Port string to in_addr structure in c

我正在尝试构建一个小的 bittorrent 客户端来将数据存储在 bittorrent dht 中。 由于不需要很多 bittorrent 功能,我尽量保持简单,因为它只需要在几个有限的用例中运行。

我正在尝试从 bootstrap 节点获取的消息中解析有关新节点的信息。每个节点的信息都是 26 字节长。 20字节是节点ID,4字节IP地址和2字节端口号。所有信息都是二进制的。 我想将 IP 地址和端口号存储在一个结构体 (myNode) 中,该结构体有一个 in_addr IP 参数和未标记的端口短参数。

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] = '[=13=]';         // 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;
}

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

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