我试图建立一个小的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;
}
答案 0 :(得分:0)
您的问题出在(*pos << 24) | (*(pos+1) << 16) | (*(pos+2) << 8) | *(pos+3)
。
如果pos[0,...,3]
中的任何值为负数,则整个表达式为负数。