简体   繁体   English

C:存储和读取ipv4 / ipv6地址和端口

[英]C: Store and read ipv4/ipv6 address and port

What I'm trying is that: 我正在尝试的是:

I have a struct: 我有一个结构:

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

I just want to have some methods like: 我只想拥有一些方法,例如:

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

and then 接着

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

I tried with sockaddr_storage and getaddrinfo and etc... but after 2 days of try and fail i need help. 我尝试了sockaddr_storage和getaddrinfo等...,但是尝试2天后失败了,我需要帮助。

a working example is very appreciate! 一个工作示例非常感谢! thanks! 谢谢!

EDIT: clarification 编辑:澄清

1) I want a data structure that can hold a ipv4 OR a ipv6 address and a port (maybe sockaddr_storage?) 1)我想要一个可以容纳ipv4或ipv6地址和端口的数据结构(也许是sockaddr_storage?)

2) I want a method to store a new address (ipv4 OR ipv6 and port) in this structure, from a string 2)我想要一个方法来从字符串中存储一个新地址(ipv4或ipv6和端口)

3) I want a method to print the ip address AND the port from this structure 3)我想要一种从该结构中打印IP地址和端口的方法

EDIT2: my best attempt for now EDIT2:我目前最大的尝试

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

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

but now i don't know how to print the ip and the port 但现在我不知道如何打印IP和端口

I finally did it! 我终于做到了!

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);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM