Question

J'essaie de créer mon application avec mingw+msys.

Mon code utilise Winsock.Lorsque je le compile, j'obtiens le message d'erreur suivant :

$ gcc -o sample sample.c -lws2_32
    C:\Users\user\AppData\Local\Temp\ccsdWlQR.o:sample.c:(.text+0xeb): undefined reference to `getaddrinfo'
    collect2.exe: error: ld returned 1 exit status

Ceci est mon code qui a été migré depuis Linux en modifiant certains en-têtes.

#include <stdio.h>
#include <WinSock2.h>
#include <WS2tcpip.h>

main(int argc,char *argv[])
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2,2), &wsaData);

    printf("Hello world with winsock");

    int sock;
    char *hostAddress;
    struct addrinfo hints,*res;
    int err;
    memset(&hints,0,sizeof(hints));
    hints.ai_family = AF_UNSPEC; 
    hints.ai_socktype = SOCK_DGRAM;
    getaddrinfo("127.0.0.1",12345,&hints,&res);

    printf("getaddrinfo %s\n",strerror(errno));
    printf("getaddrinfo : %s \n",gai_strerror(err));


    struct sockaddr_in *addr;
    struct addrinfo *rp;
    for (rp = res; rp != NULL; rp = rp->ai_next) {
        addr = (struct sockaddr_in *)rp->ai_addr; 
        printf("dstPort  = %d\n",ntohs(addr->sin_port));
        printf("dstAddr  = %s\n",inet_ntoa((struct in_addr)addr->sin_addr));
        hostAddress = inet_ntoa((struct in_addr)addr->sin_addr);    
    }
    WSACleanup( );                                    

}

Comment puis-je utiliser gettarrinfo() sous Windows ?

Il s'agit des informations supplémentaires dont le message est modifié après avoir essayé l'article de dgreenday.

sample.c:22:2: warning: passing argument 2 of 'getaddrinfo' makes pointer from i
nteger without a cast [enabled by default]
  getaddrinfo("124.0.0.1",12345,&hints,&res);
  ^
In file included from sample.c:4:0:
c:\mingw\include\ws2tcpip.h:391:12: note: expected 'const char *' but argument i
s of type 'int'
 int WSAAPI getaddrinfo (const char*,const char*,const struct addrinfo*,
Était-ce utile?

La solution

Je soupçonne que vous disposez simplement d'un SDK obsolète et que la bibliothèque d'importation fournie dans votre SDK n'inclut pas getaddrinfo.Votre programme, compilé de la manière dont vous décrivez les liens sur mon système Mingw.

Mettez à jour votre système Mingw ou créez une bibliothèque d'importation contenant getaddrinfo.

Noter que:

getaddrinfo("124.0.0.1",12345,&hints,&res);

devrait être:

getaddrinfo("124.0.0.1","12345",&hints,&res);

Et vous ne vérifiez pas correctement les erreurs.Vous devez prendre note de la valeur renvoyée par getaddrinfo.Il n'est pas approprié d'ignorer cela et de vérifier ensuite errno.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top