将 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]
中的任何值是负数,则整个表达式都是负数。
我正在尝试构建一个小的 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]
中的任何值是负数,则整个表达式都是负数。