Właśnie zacząłem uczyć się winsock poprzez książkę "Beej's guide to network programming". Programuję pod Windowsem i uruchamiam go przez gcc. To dopiero początek pisania mojego pierwszego programu serwera, ale daje mi te błędy, gdy próbuję skompilować.Błąd kompilacji winsock, nie można znaleźć struktur addrinfo i niektórych powiązanych funkcji
/* Server */
#include <iostream>
#include <windows.h>
#include <winsock2.h>
using namespace std;
const int winsockVersion = 2;
#define BACKLOG 10
#define PORT 3000
int main(void){
WSADATA wsadata;
if (WSAStartup(MAKEWORD(winsockVersion,0),&wsadata) == 0){
struct addrinfo hints, *res;
memset(&hints,0,sizeof hints);
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
if (getaddrinfo(NULL,PORT,&hints,&res) == 0){
cout<<"-Call to get addrinfo successful!." << endl;
}
cout<<"res af_family" << res->ai_family << endl;
}
//clear stuff
if(WSACleanup() != 0){
cout<<"-WSACleanup unsuccessful" << endl;
}else{
cout<<"-WSACleanup successful" << endl;
}
return 0;
}
są to błędy jestem otrzymujących
g++ -o server.exe server.cpp -lws2_32
Process started >>>
server.cpp: In function `int main()':
server.cpp:20: error: aggregate `addrinfo hints' has incomplete type and cannot be defined
server.cpp:25: error: `AI_PASSIVE' was not declared in this scope
server.cpp:27: error: `getaddrinfo' was not declared in this scope
server.cpp:31: error: invalid use of undefined type `struct addrinfo'
server.cpp:20: error: forward declaration of `struct addrinfo'
server.cpp:54:2: warning: no newline at end of file
<<< Process finished.
nie powinien struktury i funkcje zostać zdefiniowane w obu windows.h lub winsock.h ?.
ROZWIĄZANIE
EDIT każdemu, kto natyka się na tym, dodać
#define _WIN32_WINNT 0x501
#include <ws2tcpip.h>
na górze źródła jeśli getaddrinfo mówi, że jego nielegalna.
hej dzięki za to #define _WIN32_WINNT 0x501 zaoszczędziło mi trochę kłopotu :) – Lefteris
Żadnych problemów :-). – silent
Jestem na Win7, VS2015 i do tej pory nie musiałem dodawać instrukcji #define, ale DID musi dodać instrukcję #include. Moja kompilacja może być trochę dziwna, ponieważ pracuję z zestawem starych bibliotek. – Andrew