سؤال

أحاول إنشاء تطبيقي باستخدام 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() في ويندوز؟

هذه هي المعلومات الإضافية التي تم تغيير الرسالة بعد تجربة مقالة 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