getaddrinfo() не может быть разрешен winsock

У меня проблемы с запуском 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;

person Dron    schedule 30.03.2012    source источник
comment
Я понятия не имею, что означает Функция «getaddrinfo» не может быть разрешена, но убедитесь, что вы ссылаетесь на ws2_32.lib. Что касается последней ошибки, вы вызываете функцию, которая принимает 4 аргумента с одним аргументом, поэтому я не знаю, чего вы ожидаете.   -  person ildjarn    schedule 31.03.2012
comment
Да, я связываю ws2_32.lib, getaddrinfo(NULL), который я только что добавил, чтобы увидеть, скажет ли он мне, что аргументы неверны (и, таким образом, фактически найду функцию, хотя она говорит мне, что не может)   -  person Dron    schedule 31.03.2012
comment
Проблема в том, что сообщения об ошибках, которые вы разместили, не выводятся ни одним из инструментов, с которыми я знаком, поэтому я даже не знаю, что означает не может быть разрешено в этом контексте.   -  person ildjarn    schedule 31.03.2012
comment
Я использую Eclipse и пытаюсь заставить это работать под Windows, кажется, я правильно связал ws2_32.lib, если я удалю его, все ад вырвется   -  person Dron    schedule 31.03.2012
comment
Возможный дубликат этого . Похоже на ошибку самого Elipse, а не компилятора.   -  person rodrigo    schedule 31.03.2012


Ответы (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, как обычно. Мое приложение было простым приложением с одним файлом — может быть, имеет смысл добавить его в свой собственный заголовок и включить его там, где это необходимо.

#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() { /* ... */ }
person nevelis    schedule 27.07.2014