web-dev-qa-db-fra.com

'inet_pton': identifiant introuvable

J'essaie d'inclure le code suivant dans mon programme mais l'erreur ('inet_pton': identifiant non trouvé) va apparaître.

// IPv4:

struct sockaddr_in ip4addr;
int s;

ip4addr.sin_family = AF_INET;
ip4addr.sin_port = htons(3490);
inet_pton(AF_INET, "10.0.0.1", &ip4addr.sin_addr);

s = socket(PF_INET, SOCK_STREAM, 0);
bind(s, (struct sockaddr*)&ip4addr, sizeof ip4addr);

Sortie

 error C3861: 'inet_pton': identifier not found

l'en-tête inclus

 #include <stdio.h>
 #include <stdlib.h>
 #include "udpDefine.h"
 #include <windows.h>

toute aide peut être manquée certains en-têtes ou lib.

18
abdo.eng 2006210

la fonction 

int inet_pton(int af, const char *src, void *dst);

est déclaré dans le fichier d'en-tête:

#include <arpa/inet.h>

s'il s'agit de Windows (Vista ou version ultérieure), il existe une version analogique de Winsock avec cette version ANSI:

INT WSAAPI InetPton(
  _In_   INT  Family,
  _In_   PCTSTR pszAddrString,
  _Out_  PVOID pAddrBuf
);

essayez #include <Ws2tcpip.h> add Ws2_32.lib

31
4pie0

Dans Windows XP (et versions ultérieures), vous pouvez utiliser les fonctions suivantes:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>    

#include <winsock2.h>
#include <ws2tcpip.h>


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

Lien avec la bibliothèque ws2_32.

14
Petar Korponaić

Dans mon cas, la fonction était introuvable, car un fichier "#define WINVER 0x0502" se trouvait dans un fichier d'en-tête.

Sur les systèmes Windows, la version 0x600 (= Vista) est la moins requise pour cette fonction.

1
David Gausmann

Les utilisateurs Windows peuvent également trouver la réponse ici:

https://docs.Microsoft.com/en-us/windows/desktop/api/ws2tcpip/nf-ws2tcpip-inetptonw

La fonction InetPton convertit une adresse réseau Internet IPv4 ou IPv6 sous sa forme de présentation texte standard en sa forme binaire numérique. La version ANSI de cette fonction est inet_pton.

La fonction InetPton est prise en charge sous Windows Vista et versions ultérieures.

Lorsque UNICODE ou _UNICODE n'est pas défini, InetPton est défini sur InetPtonA, version ANSI de cette fonction. La version ANSI de cette fonction est toujours définie en tant que inet_pton.

Header      ws2tcpip.h
Library     Ws2_32.lib
DLL         Ws2_32.dll

Vous devez utiliser l'en-tête ws2tcpip.h et ajouter Ws2_32.lib à votre éditeur de liens.

1
Michal M.