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

时间:2014-06-08 16:30:38

标签: c arrays char ip port

我有一个固定长度的数组,每个条目都来自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 *分配正确的大小。

1 个答案:

答案 0 :(得分:0)

使用(例如)struct sockaddr_storage stor的成员ss_family来确定地址系列,并根据此选择与v4addrv6addr一起使用{ {3}}

端口号以网络字节顺序排列,因此在使用之前应传递给inet_ntop()

要使用的v4addrv6addr成员可以从<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()