C++ 对Winsock函数的未定义引用

C++ 对Winsock函数的未定义引用,c++,c,sockets,networking,C++,C,Sockets,Networking,我不熟悉C++中的Windows socket编程,在这里我一直在学习,但遇到了一些错误 #define _WINSOCK_DEPRECATED_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS //https://guidedhacking.com/threads/c-winsock-networking-tutorial-introduction.12131/ #pragma comment(lib, "ws2_32.lib")

我不熟悉C++中的Windows socket编程,在这里我一直在学习,但遇到了一些错误

#define _WINSOCK_DEPRECATED_NO_WARNINGS

#define _CRT_SECURE_NO_WARNINGS

//https://guidedhacking.com/threads/c-winsock-networking-tutorial-introduction.12131/

#pragma comment(lib, "ws2_32.lib")
#include <WinSock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

#define PORT 80

const char szHost[] = "www.google.com";

int main(const int argc, const char *argv[]) {
    // Init WINSOCK
    WSAData wsaData;
    WORD DllVersion = MAKEWORD(2, 1);
    if (WSAStartup(DllVersion, &wsaData) != 0) {
        fprintf(stderr, "WSAStartup()\n");
        getchar();
        ExitProcess(EXIT_FAILURE);
    }

    // Create socket
    SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0) {
        fprintf(stderr, "socket()\n");
        getchar();
        ExitProcess(EXIT_FAILURE);
    }

    // Get Server info
    HOSTENT *host = gethostbyname(szHost);
    if(host == nullptr) {
        closesocket(sock);
        fprintf(stderr, "gethostbyname()\n");
        getchar();
        ExitProcess(EXIT_FAILURE);
    }

    // Define server info
    SOCKADDR_IN sin;
    ZeroMemory(&sin, sizeof(sin));
    sin.sin_port = htons(PORT);
    sin.sin_family = AF_INET;
    memcpy(&sin.sin_addr.S_un.S_addr, host->h_addr_list[0], sizeof(sin.sin_addr.S_un.S_addr));

    // Connect to server
    if (connect(sock, (const sockaddr *)&sin, sizeof(sin)) != 0) {
        closesocket(sock);
        fprintf(stderr, "connect()\n");
        getchar();
        ExitProcess(EXIT_FAILURE);
    }
    // Send data to server
    const char szMsg[] = "HEAD / HTTP/1.0\r\n\r\n";
    if (!send(sock, szMsg, strlen(szMsg), 0)) {
        closesocket(sock);
        fprintf(stderr, "send()\n");
        getchar();
        ExitProcess(EXIT_FAILURE);
    }

    // Recieve data back from server
    char szBuffer[4096];
    char szTemp[4096];
    while (recv(sock, szTemp, 4096, 0))
        strcat(szBuffer, szTemp);

    printf("%s\n", szBuffer);

    closesocket(sock);
    getchar();
    ExitProcess(EXIT_SUCCESS);
}

看起来您正在使用MinGW for windows,这让我相信您正在使用代码块或Eclipse(或类似的IDE)。您使用的代码没有错,只是需要正确链接

线路

#pragma注释(lib,“ws2_32.lib”)

有点特定于VisualStudio。如果您使用的是代码块,则需要使用GUI在链接器指令中添加ws2_32库。Eclipse(或您正在使用的IDE)将需要类似的步骤


您可能需要阅读和的演练。

gcc不解释该pragma。编译/链接时,需要显式链接ws2_32和winsock。