2012-03-30 4 views
0

У меня проблемы с работой winsock, я просто озадачен и не знаю, что делать дальше.getaddrinfo() не удалось решить 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 

Здесь «S код:

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; 
+2

Я понятия не имею, что «* Функция„getaddrinfo“не может быть решен *» означает, но убедитесь, что вы ссылаетесь на 'ws2_32.lib'. Что касается последней ошибки, вы вызываете функцию, которая принимает 4 аргумента с одним аргументом, поэтому я не знаю, чего вы ожидаете. – ildjarn

+0

Да, я связываю ws2_32.lib, getaddrinfo (NULL), который я только что добавил, чтобы увидеть, не скажет ли он, что аргументы неправильны (и, таким образом, фактически находят функцию, пока она говорит мне, что она не может) – Dron

+0

Проблема в том, сообщения об ошибках, которые вы отправили, не выводятся никаким инструментом, с которым я знаком, поэтому я даже не знаю, что «не удалось решить» означает в этом контексте. – ildjarn

ответ

2

Сыворотка! Я опаздываю на вечеринку на два года. Но я имею ответ для вас & других в одной лодке: 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() { /* ... */ }