代码之家  ›  专栏  ›  技术社区  ›  REALFREE

如何从C语言中的sock结构中获取IP地址?

  •  34
  • REALFREE  · 技术社区  · 14 年前

    我正在编写简单的服务器/客户机,并尝试获取客户机IP地址并将其保存在服务器端,以决定哪个客户机应该进入关键部分。我在网上搜索了好几次,但找不到合适的方法从sock结构中获取IP地址。

    我相信这是一种在服务器接受客户端请求后从sock struct获取IP的方法。更具体地说,在服务器执行后的C中

    csock = accept(ssock, (struct sockaddr *)&client_addr, &clen) 
    

    谢谢

    3 回复  |  直到 7 年前
        1
  •  45
  •   Goz    9 年前

    好的,假设您使用的是IPv4,请执行以下操作:

    struct sockaddr_in* pV4Addr = (struct sockaddr_in*)&client_addr;
    struct in_addr ipAddr = pV4Addr->sin_addr;
    

    如果您希望IP地址作为字符串,请执行以下操作:

    char str[INET_ADDRSTRLEN];
    inet_ntop( AF_INET, &ipAddr, str, INET_ADDRSTRLEN );
    

    ipv6也很简单…

    struct sockaddr_in6* pV6Addr = (struct sockaddr_in6*)&client_addr;
    struct in6_addr ipAddr       = pV6Addr->sin6_addr;
    

    获取字符串几乎与IPv4相同

    char str[INET6_ADDRSTRLEN];
    inet_ntop( AF_INET6, &ipAddr, str, INET6_ADDRSTRLEN );
    
        2
  •  34
  •   Andrew Barber Eric Lafortune    10 年前

    提取IP地址和端口号的简单而正确的方法是:

    printf("IP address is: %s\n", inet_ntoa(client_addr.sin_addr));
    printf("port is: %d\n", (int) ntohs(client_addr.sin_port));
    

    Soapbox接受的答案对所有体系结构都不正确。见 Big and Little Endian .

        3
  •  25
  •   SoapBox    14 年前

    假设 client_addr 是一个 struct sockaddr_in (通常是这样)。您可以从中获取IP地址(作为32位无符号整数) client_addr.sin_addr.s_addr .

    您可以通过以下方式将其转换为字符串:

    printf("%d.%d.%d.%d\n",
      int(client.sin_addr.s_addr&0xFF),
      int((client.sin_addr.s_addr&0xFF00)>>8),
      int((client.sin_addr.s_addr&0xFF0000)>>16),
      int((client.sin_addr.s_addr&0xFF000000)>>24));