Вопрос

Я пытаюсь создать свое приложение с помощью mingw+msys.

Мой код использует winsock.Когда я компилирую его, я получаю следующее сообщение об ошибке:

$ 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

Это мой код, который перенесен из Linux с изменением некоторых заголовков.

#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( );                                    

}

Как я могу использовать gettarrinfo() в Windows?

Это дополнительная информация о том, что сообщение изменено после попытки использования статьи 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*,
Это было полезно?

Решение

Я подозреваю, что у вас просто устаревший SDK, и библиотека импорта, поставляемая в вашем SDK, не включает getaddrinfo.Ваша программа, скомпилированная так, как вы описываете ссылки, отлично работает в моей системе mingw.

Либо обновите свою систему mingw, либо создайте библиотеку импорта, которая содержит getaddrinfo.

Обратите внимание, что:

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

должно быть:

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

И вы неправильно проверяете наличие ошибок.Вы должны обратить внимание на значение, возвращаемое getaddrinfo.нецелесообразно игнорировать это, а затем переходить к проверке errno.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top