【C++】创建TCP服务端
实现了一个基本的 TCP 服务器,可以接受多个客户端连接,然后持续接收客户端发送的信息, 最后将接收到的信息再发送回客户端 。
源码
头文件(TCPServerTest.h)
#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>#include <thread>
#include <functional> // 添加这个头文件以使用 std::bind#include <string>#pragma comment(lib, "ws2_32.lib")class TCPSever {
public:TCPSever(int port);~TCPSever();int createSocket(); //创建套接字int serverPreparation(); //服务器连接准备int startConnectClient(); //接受连接客户端void handleClient(SOCKET clientSocket); //处理客户端int Port;WSADATA wsaData;SOCKET serverSocket;struct sockaddr_in serverAddr, clientAddr;int addrLen = sizeof(clientAddr);
};
源文件(TCPServerTest.cpp)
#include "TCPServerTest.h"TCPSever::TCPSever(int port):Port(port)
{// 初始化 Windows Sockets,传入的参数MAKEWORD(2, 2)指定使用 Winsock 2.2 版本, 成功返回0,失败返回非0的错误值if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { //std::cerr << "Error initializing Winsock\n";}else{createSocket();serverPreparation();startConnectClient();}
}TCPSever::~TCPSever()
{closesocket(this->serverSocket); // 关闭与服务端的连接,关闭服务端套接字WSACleanup(); //清理 Winsock 库资源
}int TCPSever::createSocket()
{// 创建套接字this->serverSocket = socket(AF_INET, SOCK_STREAM, 0);if (this->serverSocket == INVALID_SOCKET) {std::cerr << "Error creating socket\n";WSACleanup();return 1;}
}int TCPSever::serverPreparation()
{// 设置服务器地址信息this->serverAddr.sin_family = AF_INET;this->serverAddr.sin_addr.s_addr = INADDR_ANY;this->serverAddr.sin_port = htons(Port);// bind 函数 可以绑定套接字到指定地址和端口if (bind(this->serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {std::cerr << "Error binding socket\n";closesocket(this->serverSocket);WSACleanup();return 1;}// listen函数:开始监听连接,参数10表示等待连接队列的最大长度为 10if (listen(this->serverSocket, 10) == SOCKET_ERROR) {std::cerr << "Error listening for connections\n";closesocket(this->serverSocket);WSACleanup();return 1;}std::cout << "Server listening on port " << Port << std::endl;
}int TCPSever::startConnectClient()
{while (true) //循环接收数据{SOCKET newClientSocket;// 接受客户端连接 accept函数:在循环中等待客户端连接,一旦有客户端连接,会返回一个新的套接字用于与该客户端通信,并获取客户端的地址信息newClientSocket = accept(this->serverSocket, (struct sockaddr*)&clientAddr, &addrLen);if (newClientSocket == INVALID_SOCKET) {std::cerr << "Error accepting connection\n";continue;}char clientIP[INET_ADDRSTRLEN];if (inet_ntop(AF_INET, &clientAddr.sin_addr, clientIP, INET_ADDRSTRLEN) == nullptr) {std::cerr << "Error converting client IP address\n";}else {std::cout << "Client: " << std::string(clientIP)+ ":" + std::to_string(ntohs(clientAddr.sin_port)) << std::endl;std::thread clientThread(std::bind(&TCPSever::handleClient, this, newClientSocket)); //连上后和客户端进行数据clientThread.detach();}}
}void TCPSever::handleClient(SOCKET clientSocket)
{const char* welcomeMessage = "Welcome to the server!\n";send(clientSocket, welcomeMessage, strlen(welcomeMessage), 0); // 向客户端发送信息char buffer[1024];while (true){int bytesRead = recv(clientSocket, buffer, sizeof(buffer) - 1, 0);if (bytesRead > 0) {buffer[bytesRead] = '\0';std::cout << "Received: " << buffer << std::endl;std::string response = "received: " + std::string(buffer);send(clientSocket, response.c_str(), response.length(), 0);}else {std::cerr << "Connection closed by client\n";closesocket(clientSocket);return;}}
}
调用:
#include "TCPServerTest.h"int main() {TCPSever server = TCPSever(8888);
}
结果
可以看到服务端可以支持多个客户端连接

客户端代码见:
【C++】创建TCP客户端-CSDN博客
相关文章:
【C++】创建TCP服务端
实现了一个基本的 TCP 服务器,可以接受多个客户端连接,然后持续接收客户端发送的信息, 最后将接收到的信息再发送回客户端 。 源码 头文件(TCPServerTest.h) #include <iostream> #include <winsock2.h&g…...
每天练打字6:今日状况——常用字后五百击键3第2遍已完成,赛文速度93.56
今日跟打:763字 (截至当前) 总跟打:120408字 记录天数:2467天 (实际没有这么多天,这个是注册账号的天数) 平均每天:48字 本周目标完成进度: 练习常用单字后5…...
rk3568创建基于Ubuntu18.04交叉编译遇到的坑
尽管配置过rk3288,觉得rk3568也不会有啥问题,但还是掉坑了。 一、安装依赖库 安装完ubuntu后,先进行升级 sudo apt update sudo apt upgrade然后安装依赖库 $ sudo apt-get install repo git-core gitk git-gui gcc-arm-linux-gnueabihf u-…...
对“一个中心,三重防护”中安全管理中心的理解
安全管理中心 本控制项为网络安全等级保护标准的技术部分。本项主要包括系统管理、审计管理、安全管理和集中管控四个控制点,其中的集中管控可以说是重中之重,主要都是围绕它来展开的。 28448基本要求中安全管理中心 8.1.5 安全管理中心 8.1.5.1 系统…...
jmeter用csv data set config做参数化1
在jmeter中,csv data set config的作用非常强大,用它来做批量测试和参数化非常好用。 csv data set config的常用配置项如下: Variable Names处,写上源文件中的参数名,用于后续接口发送请求时引用 Ignore first line…...
软件分享 丨eSearch 截图软件
在日常的工作和学习中,截图是一项非常常见且重要的操作。无论是记录重要的信息、制作教程,还是与他人分享有趣的内容,一款好用的截图软件都能让我们的效率大大提高。今天,就给大家分享一款功能强大的截图软件 - eSearch。 一、强…...
pytorh学习笔记——cifar10(一)生成数据
CIFAR(Canadian Institute For Advanced Research)是一个用于图像识别研究的数据集。CIFAR数据集包含多个子数据集,最常用的是CIFAR-10和CIFAR-100。 CIFAR-10数据集包含60000张32x32彩色图像,分为10个类别,每…...
pikachu靶场SSRF-curl测试报告
目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、实现ssrf攻击 四、源代码分析 五、结论 一、测试环境 1、系统环境 渗透机:本机(127.0.0.1) 靶 机:本机(127.0.0.1) 2、使用工具/软件 测试网址:…...
Java项目-基于Springboot的农机电招平台项目(源码+说明).zip
作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…...
Systemd:简介
1号进程 Systemd是linux系统的守护进程,它要管理正在运行的 Linux 主机的许多方面,包括挂载文件系统、管理硬件、处理定时器以及启动和管理生产性主机所需的系统服务。 $ ps -u -p 1 USER PID %CPU %MEM VSZ RSS TTY STAT START TI…...
Snapshot包和Release包区别
Snapshot包和Release包区别 Snapshot包: 代表开发中的版本,可能不稳定。 经常更新,包含最新的功能和修复。 通常用于测试和开发阶段。 Release包: 代表稳定的、经过全面测试的版本。 版本号通常是固定的,适合生产环…...
最近网站频繁跳转到黑产网站,怀疑是51.la统计代码的问题
最近我的几个网站,都出现了一个问题,就是访问的时候会莫名其妙的跳转到黑产网站。 通过排查了网页代码,发现网页都有一个共同点,就是使用了51.la统计。为什么会怀疑是51la统计代码问题?因为我的网页只有统计代码外没有…...
【python_修改PPT中字体,run.font.name只对英文生效怎么办?】
python_修改PPT中字体,run.font.name只对英文生效怎么办? 参考:使用pptx_ea_font库设置中文字体 from pptx import Presentation from pptx.util import Pt from pptx_ea_font import set_font# 打开现有的 PPT 文件 prs Presentation(D:\…...
【web】JDBC
项目连接数据库 右侧导航栏找到databsae 如果没有驱动,先下载驱动 填写数据库用户名密码 勾选对应的表即可 JDBC代码流程 1,配置信息 2,加载驱动 从MySQL Connector/J 5.1版本开始,推荐使用com.mysql.cj.jdbc.Driver这个新的驱动类。 3,链接数据库…...
MATLAB代码介绍:一段轨迹的指纹定位,KNN,三维,四个锚点(附源代码,可复制粘贴)
文章目录 产品介绍:三维指纹定位 KNN MATLAB 模型概述源代码运行结果功能亮点代码结构应用场景结论产品介绍:三维指纹定位 KNN MATLAB 模型 概述 本 MATLAB 代码实现了一种基于 KNN(K-Nearest Neighbors)算法的三维指纹定位系统,利用四个基站(锚点)信号强度进行移动终…...
XML Schema 复合空元素
XML Schema 复合空元素 XML Schema 是一种用于定义 XML 文档结构和内容的语言。在 XML Schema 中,元素可以被定义为简单类型或复杂类型。简单类型元素不能包含其他元素或属性,而复杂类型元素可以包含其他元素、属性或两者都有。复合空元素是一种特殊类型…...
Java面向对象编程基础(二)
Java面向对象编程基础二 一、package与import关键字的使用1.说明2.包的作用3.JDK中主要的包4. import5.import关键字的使用 二、封装性1.为什么要封装?2.如何封装?3.作用4.权限修饰符的权限大小5.案例 三、构造器1 构造器的使用说明2 案例: 四、实例变量赋值过程1 …...
[PHP]重复的Notice错误信息
<?php $a []; var_dump($a[name]);执行结果: 原因: display_errors和error_reporting都打开了Notice错误信息...
2024年第四届“网鼎杯”网络安全大赛-赛前模拟训练
文章目录 网络安全(WEB)签到题WEB01WEB02 二进制漏洞安全(PWN)PWN01潜在的安全漏洞分析攻击步骤exp 逆向工程(REVERSE)REVERSE01代码分析重构密码 密码学(CRYPTO)CRYPTO01CRYPTO02 杂…...
AI金融攻防赛:YOLO理论学习及赛题进阶思路(DataWhale组队学习)
引言 大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月学习赛的AI金融攻防赛学习总结文档。本文主要讲解如何在金融场景凭证篡改检测中应用YOLO算法。我们将从模型概述、数据准备、训练流程以及模…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
