gpt4 book ai didi

c - 从多个 sockaddr_storage 中提取 IP 和端口到 char* 中

转载 作者:行者123 更新时间:2023-11-30 17:32:32 24 4
gpt4 key购买 nike

我有一个固定长度的数组,每个条目都来自 struct contact 类型

typedef struct contact
{
int fd;
union
{
struct sockaddr_in v4addr;
struct sockaddr_in6 v6addr;
struct sockaddr_storage stor;
};

char buf[FRAME_BUF_LEN];
int len;
char name[32];
} contact_t;

我需要将每个条目的 IP 和端口提取到 char* 中。结果应该是这样的

192.168.0.1 1234\n192.168.0.2 1235\n192.168.0.3 1236\n //and so on..

老实说,我不知道如何获取信息并为最终的 char* 分配正确的大小。

最佳答案

使用(例如)struct sockaddr_storage stor成员(member)ss_family确定地址族并根据此选择 v4addrv6addr inet_ntop() 一起使用.

端口号按网络字节顺序排列,因此应传递给 ntohs() 使用前。

v4addr的成员和v6addr可以从<netinet/in.h>中提取使用:

/* Structure describing an Internet socket address.  */
struct sockaddr_in
{
[...]

in_port_t sin_port; /* Port number. */
struct in_addr sin_addr; /* Internet address. */

[...]
};

/* Ditto, for IPv6. */
struct sockaddr_in6
{
[...]

in_port_t sin6_port; /* Transport layer port # */

[...]

struct in6_addr sin6_addr; /* IPv6 address */

[...]
};
<小时/>

要创建编译时大小未知的缓冲区,通常使用动态内存分配。

要连续分配大小不断增加的内存块,例如循环数组并添加地址:端口元组时,请使用 realloc() 特别是。

关于c - 从多个 sockaddr_storage 中提取 IP 和端口到 char* 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24108268/

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