C++socket网络编程(跨平台)实战HTTP服务器(三)

简介:

             封装TCP类


封装一下tcp类, 步骤还可以简化,

直接放上代码类名:XTCP


xtcp.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef _XTCP_H_
#define _XTCP_H_
#include <iostream>
#include <string.h>
class  XTCP
{
public :
XTCP();
virtual  ~XTCP();
public :
int  CreateSocket(); //创建socket 反悔socket
bool  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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "XTCP.h"
#ifdef WIN32
#include <Windows.h>
#define socklen_t int
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#define closesocket close
#include <string.h>
#endif
XTCP::XTCP()
{
#ifdef WIN32
static  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);
//记录socket
tcp.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;
}

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include "XTCP.h"
#include <thread>
class  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 ;
}
//用户的socket
XTCP 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 就行了

1
2
3
4
5
6
7
8
9
10
11
12
CC=g++
SRC=main.cpp XTCP.cpp
OBJ=hello.o
EXEC=manc
start:
         $(CC) $(SRC) -o $(EXEC) -std=c++11 -lpthread
$(OBJ):
         $(CC)  $(OBJ) -c $(SRC)
clean:
         rm -f $(OBJ) $(EXEC)
run:
         ./$(EXEC)

执行make start  编译连接

执行make run  执行

wKioL1lpxufh3kC6AABa0Vp5PeY887.png-wh_50


成功并发,多个客户端

wKioL1lpx0GBjxNVAAOK-xSNLak213.png-wh_50


        封装TCP类到Windowsd的dll动态库

将一个类封装到dll和linux的so

在这个博客里讲:

    http://12158490.blog.51cto.com/12148490/1947885





 本文转自超级极客51CTO博客,原文链接:http://blog.51cto.com/12158490/1947886,如需转载请自行联系原作者





相关文章
|
9月前
|
存储 弹性计算 网络协议
阿里云服务器ECS实例规格族是什么?不同规格CPU型号、处理器主频及网络性能参数均不同
阿里云ECS实例规格族是指具有不同性能特点和适用场景的实例类型集合。不同规格族如计算型c9i、通用算力型u1、经济型e等,在CPU型号、主频、网络性能、云盘IOPS等方面存在差异。即使CPU和内存配置相同,性能参数和价格也各不相同,适用于不同业务需求。
635 144
|
10月前
|
JSON 监控 API
在线网络PING接口检测服务器连通状态免费API教程
接口盒子提供免费PING检测API,可测试域名或IP的连通性与响应速度,支持指定地域节点,适用于服务器运维和网络监控。
1725 0
|
10月前
|
机器学习/深度学习 存储 监控
内部文件审计:企业文件服务器审计对网络安全提升有哪些帮助?
企业文件服务器审计是保障信息安全、确保合规的关键措施。DataSecurity Plus 是由卓豪ManageEngine推出的审计工具,提供全面的文件访问监控、实时异常告警、用户行为分析及合规报告生成功能,助力企业防范数据泄露风险,满足GDPR、等保等多项合规要求,为企业的稳健发展保驾护航。
314 0
|
11月前
|
C# 图形学 开发者
Unity开发中使用UnityWebRequest从HTTP服务器下载资源。
总之,UnityWebRequest就是游戏开发者手中的万能钓鱼竿,既可以获取文本数据,也能钓上图片资源,甚至是那声音的涟漪。使用UnityWebRequest的时候,你需要精心准备,比如确定URL、配置请求类型和头信息;发起请求;巧妙处理钓获的数据;还需要机智面对网络波澜,处理各种可能出现的错误。按照这样的过程,数据的钓取将会是一次既轻松愉快也效率高效的编程钓鱼之旅。
662 18
|
9月前
|
存储 监控 Linux
Dell OpenManage Enterprise 4.5 - Dell 服务器、存储和网络设备集中管理软件
Dell OpenManage Enterprise 4.5 - Dell 服务器、存储和网络设备集中管理软件
247 0
|
11月前
|
应用服务中间件 网络安全 数据安全/隐私保护
网关服务器配置指南:实现自动DHCP地址分配、HTTP服务和SSH无密码登录。
哇哈哈,道具都准备好了,咱们的魔术秀就要开始了。现在,你的网关服务器已经魔法满满,自动分配IP,提供网页服务,SSH登录如入无人之境。而整个世界,只会知道效果,不会知道是你在幕后操控一切。这就是真正的数字世界魔法师,随手拈来,手到擒来。
539 14
|
10月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
10月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
679 0
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
459 17
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
349 10