'inet_pton': identifier not found

前端 未结 7 1101
长发绾君心
长发绾君心 2020-12-05 05:04

I\'m trying to include the following code in my program but the error (\'inet_pton\': identifier not found) will appeared.

// IPv4:

struct sockaddr_in ip4a         


        
7条回答
  •  情深已故
    2020-12-05 05:30

    In windows XP (and later) you can use these functions:

    #include 
    #include 
    #include     
    
    #include 
    #include 
    
    
    int inet_pton(int af, const char *src, void *dst)
    {
      struct sockaddr_storage ss;
      int size = sizeof(ss);
      char src_copy[INET6_ADDRSTRLEN+1];
    
      ZeroMemory(&ss, sizeof(ss));
      /* stupid non-const API */
      strncpy (src_copy, src, INET6_ADDRSTRLEN+1);
      src_copy[INET6_ADDRSTRLEN] = 0;
    
      if (WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *)&ss, &size) == 0) {
        switch(af) {
          case AF_INET:
        *(struct in_addr *)dst = ((struct sockaddr_in *)&ss)->sin_addr;
        return 1;
          case AF_INET6:
        *(struct in6_addr *)dst = ((struct sockaddr_in6 *)&ss)->sin6_addr;
        return 1;
        }
      }
      return 0;
    }
    
    const char *inet_ntop(int af, const void *src, char *dst, socklen_t size)
    {
      struct sockaddr_storage ss;
      unsigned long s = size;
    
      ZeroMemory(&ss, sizeof(ss));
      ss.ss_family = af;
    
      switch(af) {
        case AF_INET:
          ((struct sockaddr_in *)&ss)->sin_addr = *(struct in_addr *)src;
          break;
        case AF_INET6:
          ((struct sockaddr_in6 *)&ss)->sin6_addr = *(struct in6_addr *)src;
          break;
        default:
          return NULL;
      }
      /* cannot direclty use &size because of strict aliasing rules */
      return (WSAAddressToString((struct sockaddr *)&ss, sizeof(ss), NULL, dst, &s) == 0)?
              dst : NULL;
    }
    

    Link with ws2_32 library.

提交回复
热议问题