在windows上使用cmake+gcc构建
cmake文件
cmake_minimum_required(VERSION 3.25)
project(untitled1 C)
set(CMAKE_C_STANDARD 23)
add_executable(untitled1 main.c)
#连接Windows的库
target_link_libraries(untitled1 ws2_32)
main.c
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#define DEFAULT_PORT 80
#define BUFFER_SIZE 4096
int main()
{
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("Failed to initialize WinSock.\n");
return 1;
}
SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == INVALID_SOCKET)
{
printf("Failed to create socket.\n");
WSACleanup();
return 1;
}
// 设置服务器地址和端口
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_port = htons(DEFAULT_PORT);
// 绑定端口
if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR)
{
printf("Failed to bind socket.\n");
closesocket(serverSocket);
WSACleanup();
return 1;
}
// 开始监听
if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR)
{
printf("Failed to listen on socket.\n");
closesocket(serverSocket);
WSACleanup();
return 1;
}
printf("Server started. Listening on port %d...\n", DEFAULT_PORT);
while (1)
{
// 接受客户端连接
struct sockaddr_in clientAddr;
int addrLen = sizeof(clientAddr);
SOCKET clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &addrLen);
if (clientSocket == INVALID_SOCKET)
{
printf("Failed to accept client socket.\n");
closesocket(serverSocket);
WSACleanup();
return 1;
}
// 读取请求数据
char buffer[BUFFER_SIZE];
int bytesRead = recv(clientSocket, buffer, BUFFER_SIZE, 0);
if (bytesRead == SOCKET_ERROR)
{
printf("Failed to receive data from client.\n");
closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();
return 1;
}
// 解析请求
if (strncmp(buffer, "GET / HTTP/1.1", 14) == 0)
{
// 发送HTTP响应头
const char *responseHeader = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
if (send(clientSocket, responseHeader, strlen(responseHeader), 0) == SOCKET_ERROR)
{
printf("Failed to send response header.\n");
closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();
return 1;
}
// 发送网页内容
const char *pageContent = "<html><body><h1>Hello, World!</h1></body></html>";
if (send(clientSocket, pageContent, strlen(pageContent), 0) == SOCKET_ERROR)
{
printf("Failed to send page content.\n");
closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();
return 1;
}
}
else
{
// 返回404 Not Found
const char *notFoundResponse = "HTTP/1.1 404 Not Found\r\nContent-Type: text/html\r\n\r\n";
if (send(clientSocket, notFoundResponse, strlen(notFoundResponse), 0) == SOCKET_ERROR)
{
printf("Failed to send 404 response.\n");
closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();
return 1;
}
}
// 关闭客户端连接
closesocket(clientSocket);
}
// 关闭服务器
closesocket(serverSocket);
WSACleanup();
return 0;
}
报错解决
undefined reference to `__imp_WSAStartup’
cmake请添加
target_link_libraries(untitled1 ws2_32)
Visual Studio添加
#pragma comment (lib, “Ws2_32.lib”)