2015-10-25 57 views
0

我想要的是:C:存储和读取的IPv4/IPv6地址和端口

我有一个结构:

typedef struct { 
    unsigned int id; 
    struct ??? addr; 
} Peer; 

我只是想有这样一些方法:

mypeer1.addr = storeAddr("192.168.1.1", 80); 
mypeer2.addr = storeAddr("FE80:0000:0000:0000:0202:B3FF:FE1E:8329", 80); 

然后

print("%s, %d", getAddrIp(mypeer1.addr.ip), getAddrIp(mypeer1.addr.ip)); 

我尝试的Wi thockupdr_storage和getaddrinfo等... 但经过2天的尝试和失败,我需要帮助。

一个工作示例非常感谢!谢谢!

编辑:澄清

1)我希望有一个数据结构,可容纳一个IPv4或一个IPv6地址和 端口(也许struct sockaddr_storage的)

2)我想一个方法来存储一个新的?地址 这种结构(IPv4或IPv6和端口),从一个字符串

3)我想一个方法,从这个 结构打印的IP地址和端口

EDIT2:现在

typedef struct { 
    unsigned int id; 
    addrinfo* addr; 
} Peer; 

examplePeer1 = (Peer) { 0, NULL }; 
getaddrinfo("192.168.1.1", "80", NULL, &examplePeer1.addr); 

但我的最好的尝试,现在我不知道如何打印的IP地址和端口

+2

两天后你最好的尝试是什么? –

+0

我加了我最好的尝试! :) – Suxsem

回答

1

我终于做到了!

typedef struct addrinfo Addrinfo; 

typedef struct { 
    unsigned int id; 
    Addrinfo* addr; 
} Peer; 

void addr_log(Addrinfo* addr) { 
    if (addr->ai_family == AF_INET6) { 
     struct sockaddr_in6* saddr = (struct sockaddr_in6*)addr->ai_addr; 
     char ip_s[INET6_ADDRSTRLEN]; 
     inet_ntop(AF_INET6, &(saddr->sin6_addr), ip_s, INET6_ADDRSTRLEN); 
     printf("%s\n", ip_s); 
     printf("%hu\n", ntohs(saddr->sin6_port)); 
    } else if (addr->ai_family == AF_INET) { 
     struct sockaddr_in* saddr = (struct sockaddr_in*)addr->ai_addr; 
     char ip_s[INET_ADDRSTRLEN]; 
     inet_ntop(AF_INET, &(saddr->sin_addr), ip_s, INET_ADDRSTRLEN); 
     printf("%s\n", ip_s); 
     printf("%hu\n", ntohs(saddr->sin_port)); 
    } 
} 

Peer examplePeer1; 
Peer examplePeer2; 

int main (int argc, char *argv[]) 
{ 
    examplePeer1 = (Peer) { 0, NULL }; 
    getaddrinfo("FE80:0000:0000:0000:0202:B3FF:FE1E:8329", "4444", NULL, &examplePeer1.addr); 
    examplePeer2 = (Peer) { 0, NULL }; 
    getaddrinfo("192.168.1.1", "5555", NULL, &examplePeer2.addr); 

    addr_log(examplePeer1.addr); 
    addr_log(examplePeer2.addr); 
}