tcp服务端,时刻在线

C++ TCP 服务端和客户端通信的例子

在此基础上,将服务端改为时刻在线

复制代码
#include <iostream>
#include <winsock2.h>
#include <Ws2tcpip.h> // for inet_ntop

#pragma comment(lib, "Ws2_32.lib")

#define PORT 8080

int main() {
    WSADATA wsaData;
    SOCKET serverSocket, newSocket;
    struct sockaddr_in serverAddr, clientAddr;
    int clientAddrLen = sizeof(clientAddr);
    char buffer[1024] = { 0 };
    const char* message = "Hello from server";

    // 初始化 Winsock
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        std::cerr << "WSAStartup failed." << std::endl;
        return 1;
    }

    // 创建服务器套接字
    if ((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
        std::cerr << "Socket creation failed." << std::endl;
        WSACleanup();
        return 1;
    }

    // 设置服务器地址
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    serverAddr.sin_port = htons(PORT);

    // 将套接字绑定到服务器地址
    if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
        std::cerr << "Bind failed." << std::endl;
        closesocket(serverSocket);
        WSACleanup();
        return 1;
    }

    // 监听连接
    if (listen(serverSocket, 5) == SOCKET_ERROR) {
        std::cerr << "Listen failed." << std::endl;
        closesocket(serverSocket);
        WSACleanup();
        return 1;
    }

    std::cout << "Server listening on port " << PORT << std::endl;

    while (true) {
        // 接受客户端连接
        if ((newSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &clientAddrLen)) == INVALID_SOCKET) {
            std::cerr << "Accept failed." << std::endl;
            closesocket(serverSocket);
            WSACleanup();
            return 1;
        }

        // Convert client IP address to string
        char clientIP[INET_ADDRSTRLEN];
        inet_ntop(AF_INET, &clientAddr.sin_addr, clientIP, INET_ADDRSTRLEN);
        std::cout << "Connection accepted from " << clientIP << ":" << ntohs(clientAddr.sin_port) << std::endl;

        // 从客户端接收消息
        int valread;
        if ((valread = recv(newSocket, buffer, sizeof(buffer), 0)) == SOCKET_ERROR) {
            std::cerr << "Recv failed." << std::endl;
            closesocket(newSocket);
            closesocket(serverSocket);
            WSACleanup();
            return 1;
        }

        if (valread == 0) {
            std::cout << "Client disconnected." << std::endl;
        }
        else {
            std::cout << "Message from client: " << buffer << std::endl;
        }

        // 发送消息到客户端
        if (send(newSocket, message, strlen(message), 0) == SOCKET_ERROR) {
            std::cerr << "Send failed." << std::endl;
            closesocket(newSocket);
            closesocket(serverSocket);
            WSACleanup();
            return 1;
        }

        std::cout << "Message sent to client." << std::endl;

        // 关闭套接字
        closesocket(newSocket);
    }

    // 关闭服务器套接字
    closesocket(serverSocket);
    WSACleanup();

    return 0;
}
相关推荐
网络研究院14 分钟前
网络研究观-严重漏洞允许以 root 用户身份执行任意命令:CVE-2026-0273 分析
网络·安全·漏洞·修复·设备
极创信息28 分钟前
信创产品适配测试认证,域名和SSL是必须的吗?
java·开发语言·网络·python·网络协议·ruby·ssl
未来侦察班30 分钟前
网络协议物理层,“地基“是怎么练成的
网络·物联网·网络协议·物理层·tcpip
不吃土豆的马铃薯32 分钟前
高并发服务器数据库连接池设计详解
服务器·网络·数据库·c++·mysql
七夜zippoe43 分钟前
DolphinDB HTTP API接入:RESTful数据推送
网络协议·http·api·restful·dolphindb
我是一颗柠檬1 小时前
【计算机网络全面教学】应用层核心协议,HTTP/DNS/DHCP/FTP/SMTP全解析Day5(2026年)
网络协议·计算机网络·http
数据知道1 小时前
指纹浏览器代理中台设计:为每个指纹环境绑定独立出口IP的架构实现
网络协议·tcp/ip·架构
糖果店的幽灵2 小时前
软件测试接口测试从入门到精通:HTTP协议详解
软件测试·网络协议·接口测试·http协议·测试基础
数据知道2 小时前
指纹浏览器:DNS 泄漏防范与 WebRTC 本地 IP 屏蔽的底层实现
爬虫·网络协议·tcp/ip·安全·webrtc·数据采集·指纹浏览器
JustHappy9 小时前
古法编程秘籍(七):互联网到底是什么?把两台电脑怎么说话搞懂就够了
前端·后端·网络协议