![](https://img-blog.csdnimg.cn/20210501132952474.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
网络通信
网络通信
thefist11
难以忘记编程路上领导和好友的细致指导,所以必须努力!(真诚希望大家多多指导!)
展开
-
Boost Asio总结(17)心跳
1. 实现机制定时器设定时间间隔向连接另一端发送心跳包,根据发送是否成功或者另一端的回复内容来判断连接是否中断,如果连接中断则关闭Socket再重新进行侦听或发起连接请求。stpe1. 头文件定义timer boost::asio::steady_timer async_timer;step2. cppvoid async_TcpClient::heartbeat() { std::cout<<"heartbeat!"<<std::endl; s原创 2022-03-24 23:24:52 · 890 阅读 · 0 评论 -
Boost Asio总结(16)httpServer例子
#include <iostream>#include <string>#include <memory>#include "asio.hpp"using namespace std;class HttpConnection: public std::enable_shared_from_this<HttpConnection>{public: HttpConnection(asio::io_context& io): socke原创 2022-03-24 23:19:05 · 705 阅读 · 0 评论 -
Boost Asio总结(16)异步通信例子
1. clientasync_TcpClient::async_TcpClient(const tcp::endpoint &point): io_service(), endpoint(point), socket(io_service), async_timer(io_service){ connect(); io_service.run(); std::cout<<"io_service.run() is end!"<原创 2022-03-23 09:25:57 · 1251 阅读 · 0 评论 -
Boost Asio总结(16)同步通信例子
1. server#include "stdafx.h"#include <iostream>#include <boost/asio.hpp>using namespace boost::asio;using namespace std;int main(){ try { typedef ip::tcp::acceptor acceptor_type; typedef ip::tcp::endpoint endpoi原创 2022-03-23 09:23:50 · 3911 阅读 · 0 评论 -
Boost Asio总结(16)例子
step1. 创建io_server实例(在Boost1.66后的版本为io_context)boost::asio::io_service io_service;step2. 设置endpoint的地址ip和端口unsigned short port = 8080;. 客户端client auto const address = boost::asio::ip::address_v4::from_string("192.168.0.123");boost::asio::ip::tcp:原创 2022-03-23 00:23:29 · 854 阅读 · 0 评论 -
Boost Asio总结(15)class basic_stream_socket
1.. 多种构造函数重载一个参数:I/O服务两个参数:1.I/O服务和协议;2.I/O服务和socket端点. send()/receive()和write_some()/read_some()区别 相同: 功能完全相同;写数据和读数据。 不同: send()/receive()有多种重载. 异步读写函数1.1template <typename Protocol, typename Executor>class basic_stream_socket原创 2022-03-18 08:34:18 · 391 阅读 · 0 评论 -
Boost Asio总结(14)class basic_endpoint
1. 设置address,portboost\asio\ip\basic_endpoint.hpptemplate <typename InternetProtocol>class basic_endpoint{public: /// The protocol type associated with the endpoint. typedef InternetProtocol protocol_type; basic_endpoint(const InternetPro原创 2022-03-18 08:32:40 · 164 阅读 · 0 评论 -
Boost Asio总结(13) 信号
1.1eg.typedef basic_signal_set signal_set;void handler( const boost::system::error_code& error, int signal_number){ if (!error) { // A signal occurred. }}...// Construct a signal set registered for process termination.boost原创 2022-03-18 08:30:38 · 306 阅读 · 0 评论 -
Boost Asio总结(12)class basic_socket_acceptor
1. 对应socket api的accept()函数,用于服务端在指定的端口接收连接。eg. boost::asio::ip::tcp::acceptor acceptor(my_context); boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), 12345); acceptor.open(endpoint.protocol()); acceptor.bind(endpoint);1.1t原创 2022-03-18 08:29:17 · 338 阅读 · 0 评论 -
Boost Asio总结(10)定时器例子
定时器构造需要一个io_service对象1. 同步和异步1.1 同步io_context i;...deadline_timer t(i);t.expires_from_now(boost::posix_time::seconds(5));t.wait();1.2 异步void handler(boost::system::error_code ec) { ... }...io_context i;...deadline_timer t(i);t.expires_from_原创 2022-03-18 08:27:53 · 225 阅读 · 0 评论 -
Boost Asio总结(10)定时器
template <typename Clock, typename WaitTraits, typename Executor>class basic_waitable_timer{public: /// The type of the executor associated with the object. typedef Executor executor_type; /// The clock type. typedef Clock clock_type;原创 2022-03-18 08:26:08 · 895 阅读 · 0 评论 -
Boost Asio总结(9)数据缓冲区class mutable_buffer和const_buffer
保存了一个void*的内存地址和数据长度。/// Holds a buffer that can be modified.class mutable_buffer{public: /// Construct an empty buffer. mutable_buffer() BOOST_ASIO_NOEXCEPT : data_(0), size_(0) { } /// Construct a buffer to represent a given m...原创 2022-03-18 07:44:12 · 1194 阅读 · 0 评论 -
Boost Asio总结(8)class work
1. 调用run()后,即使没有io事件, 也不会退出事件循环, 而是一直等待, 当有了新的异步io调用的时候, 还可以继续使用该循环。 asio::io_context::work可以防止io_context在没有io事件的情退出int main(){ asio::io_context ioc; asio::ip::tcp::endpoint ep(asio::ip::address::from_string("127.0.0.1"), 6768); asio::ip::t原创 2022-03-18 07:41:39 · 203 阅读 · 0 评论 -
Boost Asio总结(7)class strand
strand 保证异步代码在多线程环境中正确执行,无须使用互斥量,好比一组handler的锁,加入线程保护,保证handler不会存在线程并发访问。多个线程使用io_service需要strand保证线程安全。class strand{//返回context execution_context& context() const BOOST_ASIO_NOEXCEPT { return executor_.context(); }//要求异步执行一个handler原创 2022-03-17 23:56:55 · 296 阅读 · 0 评论 -
Boost Asio总结(6)class address
class address{public: /// Default constructor. BOOST_ASIO_DECL address() BOOST_ASIO_NOEXCEPT; /// Construct an address from an IPv4 address. BOOST_ASIO_DECL address( const boost::asio::ip::address_v4& ipv4_address) BOOST_ASIO_NOEXCEPT;原创 2022-03-17 23:47:23 · 310 阅读 · 0 评论 -
Boost Asio总结(5)class tcp
1.class tcp{public: /// The type of a TCP endpoint.端点类 typedef basic_endpoint<tcp> endpoint; /// The TCP socket type.套接字类 typedef basic_stream_socket<tcp> socket; /// The TCP acceptor type.接收器 typedef basic_socket_acceptor<tcp原创 2022-03-17 23:41:21 · 169 阅读 · 0 评论 -
Boost Asio总结(4) io_service
io_service类代表了系统里的异步处理机制(如epoll),必须在asio库里的其他对象之前初始化,其他对象则向io_service提交异步操作handler。typedef io_context io_service;class io_context : public execution_context{private: typedef detail::io_context_impl impl_type;#if defined(BOOST_ASIO_HAS_IOCP) fri原创 2022-03-17 23:37:23 · 762 阅读 · 0 评论 -
Boost Asio总结(3)异步通信
程序除了要发起IO操作,还要定义一个用于回调的完成处理函数。io_service同样把IO操作转交给操作系统执行,但它不同步等待,而是立即返回。调用io_service的run()成员函数可以等待异步操作完成,当异步操作完成时io_service从操作系统获取结果,在调用handler执行后续逻辑。1.1 handler回调函数void handler(const error_code &ec);void handler(const error_code &ec, int signa原创 2022-03-17 22:39:18 · 698 阅读 · 0 评论 -
Boost Asio总结(2)同步通信
step1. 应用程序调用IO对象成员函数执行IO操作step2. IO对象向io_service 提出请求.step3. io_service 调用操作系统的功能执行连接操作.step4. 操作系统向io_service 返回执行结果.step5. io_service将错误的操作结果翻译为boost::system::error_code类型,再传递给IO对象.step6. 如果操作失败,IO对象抛出boost::system::system_error类型的异常....原创 2022-03-17 22:35:43 · 455 阅读 · 0 评论 -
Boost Asio总结(1)概述
1. 框架1.1. IO Objects层classcontexttcpip::tcp是asio主要用于TCP协议的类,内部类型endpoint、socket、acceptor和resolver是TCP通信最核心的一组类,封装了socket的连接、断开和数据收发等功能addressip::address表示IP地址,独立于TCP、UDP等通信协议,可以同时支持ipv4和ipv6,其静态成员from_string()是一个工工厂函数,可以从字符串产生ip地址,地址版本可以用原创 2022-03-17 08:42:39 · 1888 阅读 · 0 评论 -
socket通信(5)4次挥手
step1. 某个应用进程调用 close()主动关闭,发送一个FIN;step2. 另一端接收到FIN后被动执行关闭,并发送ACK确认;step3. 之后被动执行关闭的应用进程调用 close()关闭Socket,并也发送一个FIN;step4. 接收到这个FIN的一端向另一端ACK确认。...原创 2022-03-17 08:37:22 · 129 阅读 · 0 评论 -
socket通信(4)3次握手
1. 3次握手step1. 客户端向服务器发送一个SYN Jstep2. 服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1step3. 客户端再想服务器发一个确认ACK K+11.1.step0. 服务器调用 socket()、 bind()、 listen()完成初始化后,调用 accept()阻塞等待;step1. 当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;step2. 服务器监听到连接请求,即收到SY原创 2022-03-17 08:29:38 · 402 阅读 · 0 评论 -
socket通信(3)通信过程
1. 1. 1 server.cpp// Server side C program to demonstrate Socket programming#include <stdio.h>#include <sys/socket.h>#include <unistd.h>#include <stdlib.h>#include <netinet/in.h>#include <string.h>#define PORT原创 2022-03-17 08:27:22 · 207 阅读 · 0 评论 -
socket通信(2)文件读写模式
1. 文件描述符(File Descriptor)为了表示和区分已经打开的文件,UNIX/Linux 会给每个文件分配一个 ID,这个 ID 就是一个整数,被称为文件描述符(File Descriptor)。一个文件描述符只是一个和打开的文件相关联的整数,它的背后可能是一个硬盘上的普通文件、FIFO、管道、终端、键盘、显示器,甚至是一个网络连接。例如:通常用 0 来表示标准输入文件(stdin),它对应的硬件设备就是键盘;通常用 1 来表示标准输出文件(stdout),它对应的硬件设备就是显示器。原创 2022-03-17 08:24:07 · 578 阅读 · 0 评论 -
socket通信(1)概述
1. 定义Socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口,供应用层调用原创 2022-03-17 07:41:51 · 84 阅读 · 0 评论 -
TCP/IP总结(6)IP协议
1. 数据包格式1.1 TTL(IP允许通过的最大网段数量)字段(八位),规定该数据包能穿过几个路由之后才会被抛弃1.2 IP路由选择原创 2022-03-17 07:40:11 · 638 阅读 · 0 评论 -
TCP/IP总结(5)arp协议
1. 由IP地址得到其对应的MAC地址如果ARP请求包中的目标IP地址与自己的IP地址一致,那么这个节点就将自己的MAC地址塞入ARP响应包返回给主机A原创 2022-03-17 07:38:11 · 454 阅读 · 0 评论 -
TCP/IP总结(4)TCP之4次挥手
建立连接后,客户端和服务器都处于ESTABLISED状态。这时,客户端发起断开连接的请求:step1. 客户端调用 close() 函数后,向服务器发送 FIN 数据包,进入FIN_WAIT_1状态。FIN 是 Finish 的缩写,表示完成任务需要断开连接。step2. 服务器收到数据包后,检测到设置了 FIN 标志位,知道要断开连接,于是向客户端发送“确认包”,进入CLOSE_WAIT状态。注意:服务器收到请求后并不是立即断开连接,而是先向客户端发送“确认包”,告诉它我知道了,我需要准备一下才能原创 2022-03-17 00:14:19 · 1056 阅读 · 0 评论 -
TCP/IP总结(4)TCP之数据传输过程
1. 为了保证数据准确到达,目标机器在收到数据包(包括SYN包、FIN包、普通数据包等)包后必须立即回传ACK包,这样发送方才能确认数据传输成功。Ack号 = Seq号 + 传递的字节数 + 11.1 丢包定时器重新传包...原创 2022-03-17 00:03:51 · 3389 阅读 · 0 评论 -
TCP/IP总结(4)TCP 之3次握手
1. 单次握手一条消息单方面的确认需要两次通信,也就是一次单向握手的过程。2. 3次握手step1. 客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,step2. 服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即X+1。step3. 客户端再次发送确认包(ACK)SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,原创 2022-03-17 00:01:08 · 1043 阅读 · 0 评论 -
TCP/IP总结(4)TCP 之最大消息长度
1. MSS最大消息长度(Maximum Segment Size)TCP在传送大量数据时,是以MSS的大小将数据进行分割发送。. 最理想的情况是,最大消息长度正好是IP中不会被分片处理的最大数据长度。. 在建立TCP连接的同时,会确定发送数据包的单位...原创 2022-03-16 23:58:40 · 638 阅读 · 0 评论 -
TCP/IP总结(4)TCP 之数据包格式
1. 数据包格式. 序号:Seq(Sequence Number)序号占32位,用来标识从计算机A发送到计算机B的数据包的序号,计算机发送数据时对此进行标记。. 确认号:Ack(Acknowledge Number)确认号占32位,客户端和服务器端都可以发送,Ack = Seq + 1。. 标志位:每个标志位占用1Bit,共有6个,分别为 URG、ACK、PSH、RST、SYN、FIN,具体含义如下:URG:紧急指针(urgent pointer)有效。ACK:确认序号有效。PSH:接收方应原创 2022-03-16 23:53:18 · 3206 阅读 · 0 评论 -
TCP/IP总结(4)TCP 概述
1. TCP则“人如其名”,可以说是对“传输、发送、通信”进行“控制”的“协议”检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。原创 2022-03-16 23:48:31 · 314 阅读 · 0 评论 -
TCP/IP总结(3)数据包
1. 在每个分层中,都会对所发送的数据增加一个 首部,这个首部中包含了该层必要的信息。每一层都会对数据进行处理并在数据包中附上这一层的必要信息。1.1. 应用层:字符编码、格式化等. TCP包首部:源端口号:数据包是从哪里发目的端口号:数据包需要发送到哪个应用程序上;序号:表示该包中数据是发送端整个数据中第几个字节的序列号;校验和:判断数据是否损坏. IP包首部:双方IP地址. 以太网包首部:双方MAC地址...原创 2022-03-16 23:37:44 · 274 阅读 · 0 评论 -
TCP/IP总结(2)基础概念
. IP一台计算机可以拥有一个独立的 IP 地址,一个局域网也可以拥有一个独立的 IP 地址. MAC地址真正能唯一标识一台计算机的是 MAC 地址. 端口号一台计算机可以同时提供多种网络服务,计算机会为每个网络程序分配一个独一无二的端口号(Port Number),例如,Web 服务的端口号是 80,FTP 服务的端口号是 21,SMTP 服务的端口号是 25。...原创 2022-03-16 12:01:47 · 611 阅读 · 0 评论 -
TCP/IP总结(1)分层
. 应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等. 网络层:IP,ICMP,OSPF,EIGRP,IGMP. 数据链路层:SLIP,CSLIP,PPP,MTU工作特性:为IP模块发送和接收IP数据报为ARP模块发送ARP请求和接收ARP应答(ARP:地址解析协议,将IP地址转换成MAC地址)为RARP发送RARP请求和接收RARP应答...原创 2022-03-16 11:57:56 · 362 阅读 · 0 评论 -
CDN (2)特点和功能
1. 关键技术1.1 内容发布它借助于建立索引、缓存、流分裂、组播(Multicast)等技术,将内容发布或投递到距离用户最近的远程服务点(POP)处。1.2 内容分发内容分发包含从内容源到CDN边缘的Cache的过程。两种主流技术:PUSH和PULL。1.2.1 PUSH一种主动分发的技术。PUSH由内容管理系统发起,将内容从源或者中心媒体资源库分发到各边缘的 Cache节点。分发的协议可以采用 Http/ftp等。通过PUSH分发的内容一般是比较热点的内容,这些内容通过PUSH方式原创 2021-07-27 10:07:21 · 615 阅读 · 0 评论 -
CDN (1)说明
1. Content Delivery Network 内容分发网络是建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器群组成的分布式网络。依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。2. 原理假设通过CDN加速的域名为www.a.com,接入CDN网络,开始使用加速服务后,当终端用户(北京)发起HTTP请求时,处理流程如下:step1.原创 2021-07-27 09:30:11 · 641 阅读 · 0 评论