我有一个固定长度的数组,每个条目都来自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 *分配正确的大小。
答案 0 :(得分:0)
使用(例如)struct sockaddr_storage stor
的成员ss_family
来确定地址系列,并根据此选择与v4addr
或v6addr
一起使用{ {3}}
端口号以网络字节顺序排列,因此在使用之前应传递给inet_ntop()
。
要使用的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 */
[...]
};
要在编译时创建大小未知的缓冲区,请使用动态内存分配。
为了成功分配大小增加的内存块,例如循环遍历arrray并添加 address:port 元组时,尤其要使用ntohs()
。