getaddrinfo() 无法解析winsock

Posted

技术标签:

【中文标题】getaddrinfo() 无法解析winsock【英文标题】:getaddrinfo() could not be resolved winsock 【发布时间】:2012-03-30 21:45:59 【问题描述】:

我无法让 winsock 工作,我只是感到困惑,不知道下一步该尝试什么。

getaddrinfo(NULL) 只是为了表明它可以识别 getaddrinfo 应该有哪些参数,但它仍然说它无法解决它..

当我尝试在命令行中编译它并添加一些错误标志时,这就是我得到的:

C:\MinGW\bin>g++ -O0 -g3 -Wall -c -fmessage-length=0 -o test2.exe C:\Users\David\
workspace\vmulti\Debug\test2.o -lws2_32 -lmingw32
g++: warning: C:\Users\David\workspace\vmulti\Debug\test2.o: linker input file un
used because linking not done

这是编译器向我抛出的错误,我正在使用 mingw 进行编译:

Function 'getaddrinfo' could not be resolved    test.cpp        /vmulti line 48  Semantic Error
Function 'getaddrinfo' could not be resolved    test.cpp        /vmulti line 50 Semantic Error
too few arguments to function 'int getaddrinfo(const char*, const char*, const addrinfo*, addrinfo**)'  test.cpp        /vmulti line 48 C/C++ Problem

代码如下:

ws2tcpip.h:

#if (_WIN32_WINNT >= 0x0501)
void WSAAPI freeaddrinfo (struct addrinfo*);
int WSAAPI getaddrinfo (const char*,const char*,const struct addrinfo*,
                    struct addrinfo**);
int WSAAPI getnameinfo(const struct sockaddr*,socklen_t,char*,DWORD,
                   char*,DWORD,int);
#else
/* FIXME: Need WS protocol-independent API helpers.  */
#endif

test.cpp(我的程序):

#define _WIN32_WINNT 0x0501
#include <string.h>
#include <winsock2.h>
#include <iostream>
#include <stdio.h>
#include <stdint.h>
#include <ws2tcpip.h>
using namespace std;

#define MYPORT "3490"  // the port users will be connecting to
#define BACKLOG 10     // how many pending connections queue will hold

void *get_in_addr(struct sockaddr *sa)

    if (sa->sa_family == AF_INET) 
        return &(((struct sockaddr_in*)sa)->sin_addr);
    

    return &(((struct sockaddr_in6*)sa)->sin6_addr);


int main(int argc, char *argv[])

        WSADATA wsaData;
        if (WSAStartup(MAKEWORD(1,1), &wsaData) != 0) 
                fprintf(stderr, "WSAStartup failed.\n");
                exit(1);
        
    struct sockaddr_storage their_addr;
    int addr_size;
    struct addrinfo hints, *res;
    int sockfd, new_fd, len, numbytes;

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC;  // use IPv4 or IPv6, whichever
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_PASSIVE;     // fill in my IP for me

    getaddrinfo(NULL);  // Line 48

    if(getaddrinfo(NULL, MYPORT, &hints, &res) == -1); // Line 50
      cout << "Getaddrinfo error" << endl;

【问题讨论】:

我不知道“函数 'getaddrinfo' 无法解析”是什么意思,但请确保您链接到 ws2_32.lib。关于最后一个错误,您正在调用一个带有 4 个参数和一个参数的函数,所以我不知道您期望什么。 是的,我正在链接 ws2_32.lib,我刚刚添加的 getaddrinfo(NULL) 以查看它是否会告诉我参数错误(因此实际上找到了函数,而它告诉我它不能) 问题是,你发布的错误信息不是我熟悉的任何工具输出的,所以我什至不知道在这种情况下“无法解决”是什么意思。跨度> 我正在使用 Eclipse 并试图让它在 windows 下工作,似乎我已经正确链接了 ws2_32.lib,如果我将它全部删除,就会彻底松散 this 的可能重复项。它看起来像是来自 Eplipse 本身的错误,而不是来自编译器。 【参考方案1】:

喂!我迟到了两年。但我有一个答案给你和其他人在同一条船上:D

这不是 Eclipse 中的错误,而是 MinGW 中的错误 - 就在 freeaddrinfo/getaddrinfo/getnameinfo 之前,mingw 的标头的最新版本指出:

#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP)
/**
 * For WIN2K the user includes wspiapi.h for these functions.
 */

...这没有任何意义,因为 mingw 不包含该标题。

修复:我为我的应用程序中的函数添加了前向声明并像往常一样与 ws2_32.lib 链接。我的应用程序是一个简单的 1 文件应用程序 - 将其添加到您自己的标题中并在需要的地方包含它可能更有意义。

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#ifdef __cplusplus
extern "C" 
#endif
   void WSAAPI freeaddrinfo( struct addrinfo* );

   int WSAAPI getaddrinfo( const char*, const char*, const struct addrinfo*,
                 struct addrinfo** );

   int WSAAPI getnameinfo( const struct sockaddr*, socklen_t, char*, DWORD,
                char*, DWORD, int );
#ifdef __cplusplus

#endif

int main()  /* ... */ 

【讨论】:

以上是关于getaddrinfo() 无法解析winsock的主要内容,如果未能解决你的问题,请参考以下文章

getaddrinfo()

带有 systemd 的 getaddrinfo() API

对 getaddrinfo 的未定义引用

如何在 Windows 上使用 getaddrinfo()

浅谈getaddrinfo函数的超时处理机制

Error: getaddrinfo ENOTFOUND 怎么解决?