【无标题】

http服务入门方法


在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”)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值