gpt4 book ai didi

c++ - 从字节缓冲区中提取 IP

转载 作者:行者123 更新时间:2023-11-28 03:52:43 26 4
gpt4 key购买 nike

如果我有一个包含这些字节的缓冲区:
510175126-94-51080

如何提取 75126-94-51从中分离出来(这是 IP)并打印正确的 IP?

for(int i = 0; i < bytes_recv; i++) { cout << static_cast<int>(temp[i]); } cout << endl;
编辑:这是我的输出:5 1 0 1 75 126 -94 -51 0 80

最佳答案

问题中缺少很多信息。因此,您正在读取来自 SOCKS 协议(protocol)的服务器回复。首先,缓冲区不应该也不会固定大小为 10 个字节。如果你的地址是 IPv4,它有 10 个字节(巧合的是几天前已经用完了,是时候考虑 IPv6 了)。如果源有 IPv6 地址,则服务器响应的大小不同。

来自 RFC 1928 ,第 6 节,服务器回复具有以下格式:

+----+-----+-------+------+----------+----------+
|VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+

请注意,地址字段的大小是可变的。对于 IPv4,具体而言,ATYP == 0x01 和 BND.ADDR 的大小为 4,这使得 1+1+1+1+4+2 = 10 字节。但是您应该考虑其他大小也是可能的,特别是如果 ATYP == 0x03,这使得 BND.ADDR 的长度真正可变。

所以,回答你的问题,考虑到你在 char buffer[] 数组(或指针)中有这些字节,你必须首先检查地址的类型,然后像这样提取它:

#include <arpa/inet.h>

switch (buffer[3]) {
case 0x01: { /* IPv4 address */
char result[INET_ADDRSTRLEN];
inet_ntop(AF_INET, (void*)(&buffer[4]), result, sizeof result);
std::cout << "IPv4: " << result << "\n";
break;
}

case 0x04: { /* IPv6 address */
char result[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6, (void*)(&buffer[4]), result, sizeof result);
std::cout << "IPv6: " << result << "\n";
break;
}

default:
std::cout << "Unsupported format.\n";
break;
}

关于c++ - 从字节缓冲区中提取 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4887061/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com