2017-09-11 18 views
0

を見つけていない、私はC++を使用してWindows 7上のWinSock 2プログラミングの始め方いますVisual Studioで2017年、私が稼働して、ここでのWinsockクライアントのサンプルコードを取得しようとしています:https://msdn.microsoft.com/en-us/library/windows/desktop/ms737591(v=vs.85).aspx「のgetaddrinfo」:識別子

私が持っていましたエラーの全体を取り除くためにwindows.hインクルードを削除するが、私は(互いに関連して)取り除くことができない2つがある。ビルドしようとすると、次のエラーメッセージが表示されます。 C3861 freeaddrinfo': identifier not found C3861 getaddrinfo': identifier not found

視覚的なスタジオがこれらの参照を解決できるようです。コードから、私は右クリック→両方のエラーのための問題なしに定義に行きます。私はws2_32.libにリンクしているので、どちらも問題ではありません。私は、この1つのような私の検索のWindows XPまたはそれ以前のこの問題の他の例を見つけましたGetAddrInfo identifier not found。しかし、私はWindows 7を使っているので、OSの互換性は問題ではありません。私もws2tcpip.hとwspiapi.hを含めてみましたが、それは役に立たなかった。ここで

は完全ために私のコードのすべてです:

#include <ws2tcpip.h> 
#include <wspiapi.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include "stdafx.h" 

// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib 
#pragma comment (lib, "Ws2_32.lib") 
#pragma comment (lib, "Mswsock.lib") 
#pragma comment (lib, "AdvApi32.lib") 

#define DEFAULT_BUFLEN 512 
#define DEFAULT_PORT "27015" 

int __cdecl main(int argc, char **argv) 
{ 
    WSAData wsaData; 
    SOCKET ConnectSocket = INVALID_SOCKET; 
    struct addrinfo *result = NULL, 
     *ptr = NULL, 
     hints; 
    char *sendbuf = "this is a test"; 
    char recvbuf[DEFAULT_BUFLEN]; 
    int iResult; 
    int recvbuflen = DEFAULT_BUFLEN; 

    // Validate the parameters 
    if (argc != 2) { 
     printf("usage: %s server-name\n", argv[0]); 
     return 1; 
    } 

    // Initialize Winsock 
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); 
    if (iResult != 0) { 
     printf("WSAStartup failed with error: %d\n", iResult); 
     return 1; 
    } 

    ZeroMemory(&hints, sizeof(hints)); 
    hints.ai_family = AF_UNSPEC; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_protocol = IPPROTO_TCP; 

    // Resolve the server address and port 
    iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result); 
    if (iResult != 0) { 
     printf("getaddrinfo failed with error: %d\n", iResult); 
     WSACleanup(); 
     return 1; 
    } 

    // Attempt to connect to an address until one succeeds 
    for (ptr = result; ptr != NULL; ptr = ptr->ai_next) { 

     // Create a SOCKET for connecting to server 
     ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
      ptr->ai_protocol); 
     if (ConnectSocket == INVALID_SOCKET) { 
      printf("socket failed with error: %ld\n", WSAGetLastError()); 
      WSACleanup(); 
      return 1; 
     } 

     // Connect to server. 
     iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); 
     if (iResult == SOCKET_ERROR) { 
      closesocket(ConnectSocket); 
      ConnectSocket = INVALID_SOCKET; 
      continue; 
     } 
     break; 
    } 

    freeaddrinfo(result); 

    if (ConnectSocket == INVALID_SOCKET) { 
     printf("Unable to connect to server!\n"); 
     WSACleanup(); 
     return 1; 
    } 

    // Send an initial buffer 
    iResult = send(ConnectSocket, sendbuf, (int)strlen(sendbuf), 0); 
    if (iResult == SOCKET_ERROR) { 
     printf("send failed with error: %d\n", WSAGetLastError()); 
     closesocket(ConnectSocket); 
     WSACleanup(); 
     return 1; 
    } 

    printf("Bytes Sent: %ld\n", iResult); 

    // shutdown the connection since no more data will be sent 
    iResult = shutdown(ConnectSocket, SD_SEND); 
    if (iResult == SOCKET_ERROR) { 
     printf("shutdown failed with error: %d\n", WSAGetLastError()); 
     closesocket(ConnectSocket); 
     WSACleanup(); 
     return 1; 
    } 

    // Receive until the peer closes the connection 
    do { 

     iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0); 
     if (iResult > 0) 
      printf("Bytes received: %d\n", iResult); 
     else if (iResult == 0) 
      printf("Connection closed\n"); 
     else 
      printf("recv failed with error: %d\n", WSAGetLastError()); 

    } while (iResult > 0); 

    // cleanup 
    closesocket(ConnectSocket); 
    WSACleanup(); 

    return 0; 
} 

そして、私のSTDAFX.Hファイル:

任意のアイデアをいただければ幸いです。

+2

バックインクルードがwindows.h' 'の含ま入れて修正他のエラー - これはあなたの問題の根源です。また、 '#include" stdafx.h "' __MUST__をインクルードすると、どのcpp/cファイルの最初のインクルードになります。 –

答えて

0

ヘッダーの順序が間違っています。 #include "stdafx.h"は、常に.cまたは.cppファイルの最初のヘッダーインクルードにする必要があります。 (プリコンパイルされた見出しを使用する場合)。

これはstdafx.hをするために必要なものです:

#pragma once 

#include "targetver.h" 
#include <ws2tcpip.h> // includes <winsock2.h> implicitly which in turn includes <windows.h> 
#include <stdlib.h> 
#include <stdio.h> 

あなたのメインソースファイルの先頭に必要なものこの:

#include "stdafx.h" 

// Need to link with Ws2_32.lib 
#pragma comment (lib, "Ws2_32.lib") 


#define DEFAULT_BUFLEN 512 
#define DEFAULT_PORT "27015" 

int __cdecl main(int argc, char **argv) 
{ 
... 
+0

プリコンパイルされたヘッダーがまだ存在するのはなぜですか? –

+1

これはデフォルトのVisual Studioプロジェクト構成です。 – selbie

+0

そのトリックをした、ありがとう! – user3776643