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.
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
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.
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.
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 estinet_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 surInetPtonA
, version ANSI de cette fonction. La version ANSI de cette fonction est toujours définie en tant queinet_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.