C++socket网络编程(跨平台)实战HTTP服务器(三)
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,封装TCP类封装一下tcp类, 步骤还可以简化,直接放上代码类名:XTCPxtcp.h#ifndef _XTCP_H_#define _XTCP_H_#include #include class X
千家信息网最后更新 2025年12月02日C++socket网络编程(跨平台)实战HTTP服务器(三)
封装TCP类
封装一下tcp类, 步骤还可以简化,
直接放上代码类名:XTCP
xtcp.h
#ifndef _XTCP_H_#define _XTCP_H_#include#include class XTCP{public:XTCP();virtual ~XTCP();public:int CreateSocket();//创建socket 反悔socketbool Bind(unsigned short port);//绑定端口XTCP Accept();//反回一个对象void Close();//关闭 主动做int Recv(char *buf, int bufsize);//接收int Send(const char *buf, int sendsize);//发送int m_sock = 0;unsigned short m_port = 0;std::string ip;};#endif //_XTCP_H_
xtcp.cpp
#include "XTCP.h"#ifdef WIN32#include#define socklen_t int#else#include #include #include #include #define closesocket close#include #endifXTCP::XTCP(){#ifdef WIN32static bool first = true; //保证只进入一次if (first){first = false;WSADATA ws;WSAStartup(MAKEWORD(2, 2), &ws);}#endif}XTCP::~XTCP(){}int XTCP::CreateSocket(){m_sock = socket(AF_INET, SOCK_STREAM, 0);if (m_sock == -1){printf("create socket failed!\n");}return m_sock;}bool XTCP::Bind(unsigned short port){sockaddr_in sa;sa.sin_family = AF_INET;sa.sin_port = htons(port);sa.sin_addr.s_addr = htonl(0);if (bind(m_sock, (sockaddr*)&sa, sizeof(sa))){printf("bind port err\n");//绑定成功return false;}//侦听listen(m_sock, 10);//绑定失败return true;}void XTCP::Close(){if (m_sock <= 0) return;closesocket(m_sock);}XTCP XTCP::Accept(){XTCP tcp;sockaddr_in sadd;socklen_t len = sizeof(sadd);printf("lsiteb ... accept ok\n");//这里会阻塞 只有等待有新的连接 才会执行下面的代码int client = accept(m_sock, (sockaddr*)&sadd, &len);//反悔判断m_sock是否为0就行了if (client <= 0)return tcp; printf("client connect ok\n");//输出端口号和信息tcp.ip = inet_ntoa(sadd.sin_addr);//网络字节序转本地字节序哦tcp.m_port = ntohs(sadd.sin_port);//记录sockettcp.m_sock = client;printf("IP: %s:port: %d\n", tcp.ip.c_str(), tcp.m_port);return tcp;}int XTCP::Recv(char *buf, int bufsize){return recv(m_sock, buf, bufsize, 0);}int XTCP::Send(const char *buf, int sendsize){//buf 必须发送制定大小 保证发送全部成功int s = 0; //以发送的 发送大小减去以及发送的while (s != sendsize){//反回就是发送的长度int len = send(m_sock, buf + s, sendsize - s, 0);if (len <= 0)break;s += len; //加上发送的长度}return s;}
测试代码
#include "XTCP.h"#includeclass TcpThread{public://线程入口函数 创建一个void Main(){char buf[1024];for (;;){memset(buf, 0, sizeof(buf));int recv_len = client.Recv( buf, sizeof(buf) - 1);if (recv_len <= 0)break;if (strstr(buf, "quit") != NULL){char re[] = "quit success\n";int sendlen = client.Send(re, strlen(re) + 1);break;}char *p_ok = "ok\n";int sendlen = client.Send(p_ok,strlen(p_ok));printf("recv %s\n", buf);}client.Close();delete this;}//用户的socketXTCP client;};int main(int argc,char*argv[]){unsigned short port = 8016;XTCP mytcp;//创建mytcp.CreateSocket();//绑定if (!mytcp.Bind(port))return -1;for (;;){XTCP client = mytcp.Accept();//创建线程TcpThread *th = new TcpThread();th->client = client;std::thread sthr(&TcpThread::Main, th);// 释放主线程占用的资源sthr.detach();}mytcp.Close();getchar();return 0;}
原理就是: 创建一个对象XTCP server,有一个int变量,是用来记录创建的socket.的,他用来和用户建立连接,然后服务器必须要绑定端口,Bind里自动侦听。(调用了listen函数)
然后就是反回一个用户client的XTCP对象,把这个对象赋值给上面
的线程类里的成员,应为他TcpThread*th = new TcpThread();
他里面有一个th->client = client; 把他赋值给这个client.
然后创建线程在线程里等待数据收发, 这个new的对象 是在
线程函数里进行释放的 也就是closesocket后面有一个delete this. ,最后就是th->detach() 是释放主线程占用的子线程
的资源,。
移植到linux
先看下makefile
SRC 添加main.cpp 和 XTCP.cpp 就行了
CC=g++SRC=main.cpp XTCP.cppOBJ=hello.oEXEC=mancstart: $(CC) $(SRC) -o $(EXEC) -std=c++11 -lpthread$(OBJ): $(CC) $(OBJ) -c $(SRC)clean: rm -f $(OBJ) $(EXEC)run: ./$(EXEC)
执行make start 编译连接
执行make run 执行

成功并发,多个客户端
封装TCP类到Windowsd的dll动态库
将一个类封装到dll和linux的so
在这个博客里讲:
http://12158490.blog.51cto.com/12148490/1947885
线程
对象
就是
封装
成功
函数
代码
大小
字节
用户
端口
资源
长度
面的
保证
服务器
网络
服务
主动
上代
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
高考必备这个软件开发者
电子计算机网络技术好学吗
outlook发送服务器
服务器的主要生产厂家
清华大学网络安全保研官网
欧盟批评中国网络安全
ibm服务器管理口进不去
爱琳诗篇所有服务器开服
网络安全的微电影吃饭
绝地求生应该选什么服务器
设计表结构并创建数据库
sql数据库复制
cam350 软件开发商
网络安全竞赛笔记本
湖南省网络安全与信息化
数据库查询如何开两个窗口
数据库数据表连接
数据库是在计算机系统
迪普科技与网络安全
数据库字段是行吗
服务器系统管理制度
数字图书馆数据库哪里采购
富士康软件开发跳槽容易吗
我的订单退不款显示服务器繁忙
一台服务器三个终端设备
初中学历学软件开发合适吗
数字经济数据库龙头股
无锡常见网络技术要多少钱
服务器系统状态巡检工具
软件开发公司经营模式