C++ 对Winsock函数的未定义引用
我不熟悉C++中的Windows socket编程,在这里我一直在学习,但遇到了一些错误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")
#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。