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

简介:

  TCP客户端


直接用上次封装的dll动态库,linux则用so文件。首先生成编译一下.

1
2
3
4
5
6
7
#include "XTCP.h"
int  main( int  argc, char *argv[])
{
     XTCP client;
     getchar ();
     return  0;
}

            

           TCP三次握手协议详解

wKioL1lsIbKBhVaxAAED76FIjZA346.png-wh_50


服务器创建,绑定,并且listen开始监听.

客户端也要创建socket,通过这个socket调用connect.他是一个阻塞的

函数,他是要主动打开,他会先发一个SYN J(协议头当中都会包含)过去,然后服务器收到这个

包之后,他会发一个SYN K,回ack J+1回去,然后客户端发送ack k+1过去,然后connect函数返回,服务器收到accept返回.


     为什么要进行三次握手?两次行不行?

为了保证数据能正确传出去,并且能收回来, 但是服务器,收到J

在能不能确定,这是不是正确的J呢,(由于某些特殊原因J发生了变化,服务器就不知道了。)我还是会发一个J+1过去,所以就是,我服务器发送了J+1,你也得回一个K+1给我,确定值是否正确。我才能确定我能

正常发送数据给你,你也能正常发送数据给我。

这些序号,后面所有的包都是往下加,分别标识了连接,

(例如DDOS拒绝服务攻击)就是在Accept(ack K+1)不会给服务器,

然后不断发送连接信号,发多了服务器就会在等待你啊(accept阻塞),这样会导致

服务器全部阻塞。



          XTCP库connect函数封装

        

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool  XTCP::Connect( const  char  *ip, unsigned  short  port)
{
//如果socket没有创建
if  (m_sock <= 0) CreateSocket();
//连接需要这个结构体
sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(port);   //本地字节序转网络字节序
saddr.sin_addr.s_addr = inet_addr(ip);
if  (connect(m_sock, (sockaddr*)&saddr,  sizeof (saddr)) != 0)
{
printf ( "connect %s:%d failed!:%s\n" ,ip,port, strerror ( errno ));
return  false ;
}
printf ( "connect %s:%d success!\n" , ip, port);
return  true ;
}


客户端只需要只接调用上面的connect就行,不需要绑定等其他操作

#include "XTCP.h"


1
2
3
4
5
6
7
int  main( int  argc, char *argv[])
{
XTCP client;
client.Connect( "192.168.1.125" ,8046);
getchar ();
return  0;
}

wKioL1lsK_SAMOFWAAOGBdl_xX4363.png-wh_50


在linux也很简单了.

makefile:

-std=c++11 使用c++11

-I。。是头文件的路径

-lpthread是linux多线程 

-lsocket是使用到的so库

1
2
client:client.cpp
         g++ $+ -o $@ -std=c++11 -I../../xsocket/xsocket -lpthread -lxsocket

wKioL1lsLqSAwMFVAAIOqiMvxSc686.png-wh_50


这样就成功建立了连接,然后收发数据就很简单了,各自

调用send,recv了。可以试试.


            

          TCP编程总结

wKiom1lsMeqh9skTAAEttYAQPJg179.png-wh_50




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




相关文章
|
2月前
|
监控 Linux 测试技术
C++零拷贝网络编程实战:从理论到生产环境的性能优化之路
🌟 蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕C++与零拷贝网络编程,从sendfile到DPDK,实战优化服务器性能,毫秒级响应、CPU降60%。分享架构思维,共探代码星辰大海!
|
4月前
|
存储 弹性计算 网络协议
阿里云服务器ECS实例规格族是什么?不同规格CPU型号、处理器主频及网络性能参数均不同
阿里云ECS实例规格族是指具有不同性能特点和适用场景的实例类型集合。不同规格族如计算型c9i、通用算力型u1、经济型e等,在CPU型号、主频、网络性能、云盘IOPS等方面存在差异。即使CPU和内存配置相同,性能参数和价格也各不相同,适用于不同业务需求。
424 144
|
5月前
|
JSON 监控 API
在线网络PING接口检测服务器连通状态免费API教程
接口盒子提供免费PING检测API,可测试域名或IP的连通性与响应速度,支持指定地域节点,适用于服务器运维和网络监控。
545 0
|
5月前
|
机器学习/深度学习 存储 监控
内部文件审计:企业文件服务器审计对网络安全提升有哪些帮助?
企业文件服务器审计是保障信息安全、确保合规的关键措施。DataSecurity Plus 是由卓豪ManageEngine推出的审计工具,提供全面的文件访问监控、实时异常告警、用户行为分析及合规报告生成功能,助力企业防范数据泄露风险,满足GDPR、等保等多项合规要求,为企业的稳健发展保驾护航。
158 0
|
6月前
|
存储 运维 API
HPE OneView 10.0 - HPE 服务器、存储和网络设备集中管理软件
HPE OneView 10.0 - HPE 服务器、存储和网络设备集中管理软件
135 1
|
4月前
|
存储 监控 Linux
Dell OpenManage Enterprise 4.5 - Dell 服务器、存储和网络设备集中管理软件
Dell OpenManage Enterprise 4.5 - Dell 服务器、存储和网络设备集中管理软件
120 0
|
6月前
|
C# 图形学 开发者
Unity开发中使用UnityWebRequest从HTTP服务器下载资源。
总之,UnityWebRequest就是游戏开发者手中的万能钓鱼竿,既可以获取文本数据,也能钓上图片资源,甚至是那声音的涟漪。使用UnityWebRequest的时候,你需要精心准备,比如确定URL、配置请求类型和头信息;发起请求;巧妙处理钓获的数据;还需要机智面对网络波澜,处理各种可能出现的错误。按照这样的过程,数据的钓取将会是一次既轻松愉快也效率高效的编程钓鱼之旅。
315 18
|
6月前
|
应用服务中间件 网络安全 数据安全/隐私保护
网关服务器配置指南:实现自动DHCP地址分配、HTTP服务和SSH无密码登录。
哇哈哈,道具都准备好了,咱们的魔术秀就要开始了。现在,你的网关服务器已经魔法满满,自动分配IP,提供网页服务,SSH登录如入无人之境。而整个世界,只会知道效果,不会知道是你在幕后操控一切。这就是真正的数字世界魔法师,随手拈来,手到擒来。
362 14
|
5月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。