2010-11-22 12 views
14

मैंने अभी "नेटवर्क प्रोग्रामिंग के लिए बीज की मार्गदर्शिका" पुस्तक के माध्यम से winsock सीखना शुरू कर दिया है। मैं विंडोज़ के तहत प्रोग्रामिंग कर रहा हूं और इसे जीसीसी के माध्यम से चला रहा हूं। यह मेरा पहला सर्वर प्रोग्राम लिखने की शुरुआत है, लेकिन जब मैं संकलन करने की कोशिश करता हूं तो यह मुझे इन त्रुटियों को देता है।विंसॉक संकलन त्रुटि, यह addrinfo संरचनाओं और कुछ संबंधित कार्यों को नहीं देख सकता

/* 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; 
} 

इन त्रुटियों मैं

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. 

संरचनाओं और कार्यों या तो windows.h या winsock.h में परिभाषित नहीं किया जाना चाहिए प्राप्त कर रहा हूँ हैं ?.

समाधान

संपादित जो कोई भी इस पर ठोकर करने के लिए, अपने स्रोत के शीर्ष पर

#define _WIN32_WINNT 0x501 
#include <ws2tcpip.h> 

जोड़ने getaddrinfo कहते हैं अपनी अघोषित कि।

+2

अरे #define _WIN32_WINNT 0x501 के लिए धन्यवाद, मुझे कुछ परेशानी बचाई :) – Lefteris

+0

कोई समस्या नहीं :-)। – silent

+0

मैं विन 7, वीएस2015 पर हूं, और अब तक मुझे # डिफाईन स्टेटमेंट जोड़ना नहीं है, लेकिन डीआईडी ​​को # अंतर्निहित कथन जोड़ने की जरूरत है। मेरा निर्माण env थोड़ा अजीब हो सकता है क्योंकि मैं पुराने पुस्तकालयों के एक सेट के साथ काम कर रहा हूं। – Andrew

उत्तर

7

शायद आप #include <ws2tcpip.h> चाहते हैं। याद रखें कि स्टैक ओवरफ़्लो से पहले, Google इस तरह के प्रश्नों के लिए आपका मित्र है: आपको एमएसडीएन से तत्काल उत्तर मिलेंगे!

+0

इसके लिए धन्यवाद, लेकिन यह अभी भी किसी कारण से getaddrinfo नहीं देखता है? – silent

+0

पाया गया क्या गुम था :) nvm – silent

+0

@ sil3ent यह क्या था? – icecrime

0

सावधान रहें! आपके शामिल गलत हैं। समस्या यह है कि windows.h में पहले से ही winsock.h और winsock2.h शामिल हैं, फिर कुछ संरचनाओं और कार्यों को फिर से परिभाषित करता है जिसके परिणामस्वरूप बड़ी संख्या में संकलन त्रुटियां होती हैं। को winsock2.h के नीचे शामिल करें, या windows.h को पूरी तरह से शामिल करें, winsock2.h में windows.h शामिल हैं।

+0

Windows.h में winsock.h का उपयोग करने के लिए winsock.h शामिल है, आपको #define WIN32_LEAN_AND_MEAN कथन का उपयोग करने की आवश्यकता है। WinSock2 में कोड है जो winsock.h के साथ संगत नहीं है। तो, windows.h और WInSock2.h का उपयोग करने के लिए, #define का उपयोग करें। इस पृष्ठ के नीचे आधा रास्ता है जो इस बारे में बेहतर विस्तार से चर्चा करता है: https://msdn.microsoft.com/en-us/library/windows/desktop/ms737629(v=vs.85).aspx – Andrew

1

MSDN कहते हैं हम चाहिए #include <ws2tcpip.h>, लेकिन ws2tcpip.h में मैं कोड के इस टुकड़े पाया:

#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) 
/** 
* For WIN2K the user includes wspiapi.h for these functions. 
*/ 
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); 
#endif /* (_WIN32_WINNT >= _WIN32_WINNT_WINXP) */ 

इसका मतलब यह है, कि _WIN32_WINNT_WIN32_WINNT_WINXP की तुलना में कम परिभाषित किया गया है, लेकिन जब मैं करने की कोशिश की wspiapi.h में शामिल हैं, मैं "no such file or directory" मिला है। मेरा अनुमान है, यह मिनजीडब्ल्यू की गलती है, जहां पुस्तकालय के विभिन्न हिस्सों में असंगत संस्करण हैं। आप अपने दम पर #define _WIN32_WINNT _WIN32_WINNT_WINXP करने के लिए है ws2tcpip.h

0

शामिल करने से पहले यह मेरे लिए काम कर रहा है:

#include <winsock2.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

#define DEFAULT_PORT 80 

void error_die(const char *s) 
{ 
    fprintf(stderr, "Error: %s failed with error %d\n", s, WSAGetLastError()); 
    WSACleanup(); 
    exit(EXIT_FAILURE); 
} 

int main(int argc, char **argv) 
{ 
    char response[] = "HTTP/1.1 200 OK\r\n" 
    "Content-Type: text/html; charset=UTF-8\r\n\r\n" 
    "<!DOCTYPE html><html><head><title>Hello World</title></head>" 
    "<body><h1>Hello world!</h1></body></html>\r\n"; 

    char buf[4096]; 
    int msg_len, addr_len; 
    struct sockaddr_in local, client_addr; 

    SOCKET sock, msg_sock; 
    WSADATA wsaData; 

    if (WSAStartup(MAKEWORD(2, 2), &wsaData) == SOCKET_ERROR) 
    { 
     fprintf(stderr, "WSAStartup failed with error %d\n", WSAGetLastError()); 
     WSACleanup(); 
     return -1; 
    } 

    // Fill in the address structure 
    local.sin_family  = AF_INET; 
    local.sin_addr.s_addr = INADDR_ANY; 
    local.sin_port   = htons(DEFAULT_PORT); 

    sock = socket(AF_INET, SOCK_STREAM, 0); //TCP socket 

    if (sock == INVALID_SOCKET) 
     error_die("socket()"); 

    if (bind(sock, (struct sockaddr *)&local, sizeof(local)) == SOCKET_ERROR) 
     error_die("bind()"); 

    if (listen(sock, 5) == SOCKET_ERROR) // wait for connection 
     error_die("listen()"); 

    printf("Waiting for connection...\n"); 

    while (1) 
    { 
     addr_len = sizeof(client_addr); 
     msg_sock = accept(sock, (struct sockaddr*)&client_addr, &addr_len); 

     if (msg_sock == INVALID_SOCKET || msg_sock == -1) 
      error_die("accept()"); 

     printf("Accepted connection from %s, port %d\n", inet_ntoa(client_addr.sin_addr), htons(client_addr.sin_port)); 

     msg_len = recv(msg_sock, buf, sizeof(buf), 0); 

     printf("Bytes Received: %d, message: %s from %s\n", msg_len, buf, inet_ntoa(client_addr.sin_addr)); 

     msg_len = send(msg_sock, response, sizeof(response)-1 , 0); 

     if (msg_len == SOCKET_ERROR) 
      error_die("send()"); 

     if (!msg_len) 
     { 
      printf("Client closed connection\n"); 
      closesocket(msg_sock); 
      WSACleanup(); 
      return -1; 
     } 

     closesocket(msg_sock); 
    } 

    WSACleanup(); 
}  
0

मैं इस पाने के लिए निम्नलिखित के साथ काम करने में सक्षम था भी शामिल है, pragma, और परिभाषित करता है ...

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

#pragma comment(lib, "ws2_32.lib") 

आवश्यक की सूची इस उत्तर के लिए भी शामिल है एक Microsoft लेख में दिखाया जाता है: Winsock Includes

संबंधित मुद्दे