2015-10-25 3 views
0

То, что я пытаюсь что:C: Store и читать 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)); 

Я пытался ш th sockaddr_storage и getaddrinfo и т. д. ... , но после 2 дней попытки и неудачи мне нужна помощь.

Рабочий пример очень ценен! благодаря!

EDIT: уточнение

1) Я хочу, чтобы структура данных, которая может содержать в IPv4 или IPv6-адрес и в порт (возможно 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); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^