c ++ - getaddrinfo () kunne ikke løses winsock

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har problemer med at få vinge til at arbejde, jeg er bare forvirret og ved ikke rigtig hvad jeg skal prøve næste gang.


getaddrinfo(NULL) er bare der for at vise, at det genkender hvilke argumenter getaddrinfo der skal have, men det siger stadig, at det ikke kan løse det ..


Når jeg prøver at kompilere det i kommandolinjen og tilføje nogle fejlflagger, er det det, jeg får:


C:MinGWin>g++ -O0 -g3 -Wall -c -fmessage-length=0 -o test2.exe C:UsersDavid
workspacevmultiDebug	est2.o -lws2\_32 -lmingw32
g++: warning: C:UsersDavidworkspacevmultiDebug	est2.o: linker input file un
used because linking not done


Her er den fejl, kompilatoren kaster på mig, jeg kompilerer med 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


Her er koden:


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 (mit program):


#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.
");
                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;

Bedste reference


Valle! Jeg er to år for sent til festen. Men jeg har et svar til dig & Andre i samme båd: D


Det er ikke en fejl i Eclipse, det er en fejl i MinGW - lige før freeaddrinfo/getaddrinfo/getnameinfo, hedder den nyeste version af Mingws overskrifter:


#if (\_WIN32\_WINNT >= \_WIN32\_WINNT\_WINXP)
/**
 * For WIN2K the user includes wspiapi.h for these functions.
 */


... det giver ingen mening, fordi mingw ikke inkluderer den overskrift.


For at rette op: Jeg tilføjede fremsendelseserklæringer for funktionerne i min app & knyttet til ws2\_32.lib som normalt. Min app var en simpel 1-fil-app - det kan være mere fornuftigt at tilføje dette til dit eget overskrift & inkludere det, hvis det er nødvendigt.


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