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 执行
成功并发,多个客户端
封装TCP类到Windowsd的dll动态库
将一个类封装到dll和linux的so
在这个博客里讲:
http://12158490.blog.51cto.com/12148490/1947885
本文转自超级极客51CTO博客,原文链接:http://blog.51cto.com/12158490/1947886,如需转载请自行联系原作者
C++socket网络编程(跨平台)实战HTTP服务器(三)相关推荐
- C++socket网络编程大全实战http服务器(支持php)视频课程-夏曹俊-专题视频课程
C++socket网络编程大全实战http服务器(支持php)视频课程-16782人已学习 课程介绍 C++socket网络编程大全实战http服务器(支持php)视频培训教程概况:本 ...
- 视频教程-C++socket网络编程--http服务器(支持php)实战教学视频-C/C++
C++socket网络编程--http服务器(支持php)实战教学视频 夏曹俊:南京捷帝科技有限公司创始人,南京大学计算机硕士毕业,有15年c++跨平台项目研发的经验,领导开发过大量的c++虚拟仿真, ...
- Socket网络编程--简单Web服务器(6)
本来是想实现ssl连接的,但是弄了好久都不成功,就索性不做了,等以后有能力再做了.所以这一小节就是本次的最后一节了.就简单的说几个注意点. 1.加个配置文件 使用单例模式,使用一个类,该类保存一些信息 ...
- 【Linux】socket网络编程之服务器与客户端的数据交互
[Linux]socket网络编程之服务器与客户端的数据交互 前言参考 argc !=2是什么意思 inet pton函数 对stdin,stdout 和STDOUT_FILENO,STDIN_FIL ...
- C# Socket网络编程入门(服务器与客户端通信,客户端与客户端通信)
WebSocket全双工通讯链接,用于前台和后台自由发送信息 一.效果展示: 效果描述: 1.服务器充当管理员,给所有人发送信息,除服务器以外其他人都能接受到. 2.其他用户发送信息除自己以外其他用户 ...
- 【Socket网络编程进阶与实战】------ Socket网络编程快速入门
前言 本篇博客主要是分享,socket网络编程进阶与实践☞socket网络编程快速入门 一.聊一聊Socket 学习目标与收获
- Linux C++/Java/Web/OC Socket网络编程
一,Linux C++ Socket网络编程 1.什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制 ...
- 基于 Netty 网络编程项目实战课程
一 基于 Netty 网络编程项目实战课程 1项目介绍 2Netty 介绍与相关基础知识 2.1Netty 介绍 简介 Netty 是由 JBOSS 提供的一个 java 开源框架.Netty 提供异 ...
- python运维开发之socket网络编程01
python运维开发之socket网络编程01说明:本文来自来自北京老男孩linux运维实战培训中心-运维开发课程免费视频内容,本文内容为系列内容,更多分享信息见:http://oldboy.blog ...
最新文章
- redis info memory
- JavaScript对象及初始面向对象
- COCI 2018/2019 CONTEST #2 Solution
- JS密码校验规则前台验证(不能连续字符(如123、abc)连续3位或3位以上)(不能相同字符(如111、aaa)连续3位或3位以上)...
- rest php,REST介绍与REST在PHP中的应用
- PyTorch报错“/.../Loss.cu: ... [59,0,0] Assertion input_val >= zero input_val <= one failed.”
- kubernetes1.4新特性:支持两种新的卷插件
- win10无线投屏_win10无线投屏智能电视
- Dalamud:FFXIV插件框架和API-源码
- 接收机抽取的Matlab仿真代码,接收机的MATLAB仿真程序代码
- AGV车载控制系统搭建(初学者入门)
- Go 依赖管理工具 Dep 的安装及配置
- SEEDLAB2.0-Meltdown
- 盛唐气象:李白的诗与酒
- 介绍GBase 8C核心技术
- 洛谷P4417 [COCI2006-2007#2] STOL
- 1dB增益压缩点概述及测试
- 对于ios7扫描二维码功能的实现
- 活动详情页面html代码,折扣活动详情.html
- VSPD+XCOM+Proteus仿真stm32串口通信