当前位置: 首页 > 知识库问答 >
问题:

C:存储和读取IPv4/IPv6地址和端口

呼延晋
2023-03-14

我正在尝试的是:

我有一个结构:

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

编辑二:我目前最好的尝试

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

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

但现在我不知道如何打印ip和端口

共有1个答案

乐正心思
2023-03-14

我终于做到了!

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);
}
 类似资料:
  • 问题内容: 在MySQL数据库中以字符串形式存储IPv4,IPv6地址的理想大小应该是多少。varchar(32)是否足够? 问题答案: 假设文本表示为字符串: IPv4 15个字符(格式,12 + 3分隔符) IPv6的45个字符 这些是字符串的最大长度。 另存为字符串的替代方法: IPv4是32位,因此可以容纳4个字节的MySQL数据类型可以做到,使用和共同使用并处理从地址到数字以及从数字到地

  • 问题内容: 我有使用地址的应用程序(它存储它们的时间很长),因此它只了解地址。 可以将地址转换为with 吗? 问题答案: 尽管IPv4地址范围具有等效的IPv6,但是您不能将所有IPv6地址都转换为IPv4-IPv6地址比IPv4地址更多。 解决此问题的唯一明智的方法是更新您的应用程序,以便能够理解和存储IPv6地址。

  • 问题内容: 正如“具有ipv6功能的inet_aton和inet_ntoa功能所需 ”中所要求的那样,当前没有用于存储IPv6地址的MySQL函数。建议用于存储/插入的数据类型/功能是什么?(我不打算将它们存储为字符串)。我也不想将IPv6地址分为2个INT。 问题答案: 怎么样: 那应该足够有效。 如该错误报告中所述,当前在MySQL服务器中没有将文本IPv6地址从二进制转换为二进制的功能。您需

  • 我有一个python应用程序,它需要为IPv6连接选择一个特定的本地源地址,但可以为IPv4连接使用“any”0.0.0.0。但应用程序在中使用主机名,以允许从名称查找地址。 那么,如果在调用之前我不知道是IPv4地址还是IPv6地址,那么如何将特定的IPv6源地址和IPv4“any”地址绑定到本地套接字? 一定有更好的办法。我怀疑我必须自己实现地址查找和选择,并将地址而不是名称传递给。这样,在进

  • 我的计算机上有多个网卡。(因为VMWare) 如何找到活动卡的IPv4地址。我的意思是,如果我在终端中发送ping并在WireShark中拦截数据包,我需要“Source”的地址。 我想过检查每个网络接口,看看GateWay是空还是空?或者可能ping127.0.0.1并获取ping请求的IP源?但无法实现它。 现在我有这个代码,我在StackOverFlow上找到的 但它给了我VmWare卡的I

  • 关于使用提供的代码生成IP地址的链接。 我已经实现了获取IP地址的确切代码,但它同时提供了IPv4和IPv6地址。下面是产生的价值。 (已编辑IPv6地址) 有没有办法只获取IPv4值而不同时获取两者?