首页 > 编程语言 >网络编程基本流程介绍

网络编程基本流程介绍

时间:2024-08-02 10:52:45浏览次数:17  
标签:asio socket ip 流程 编程 网络 tcp address boost

网络编程基本流程

网络编程的基本流程对于服务端是这样的

  • 服务端

    1. socket——创建socket对象。
    2. bind——绑定本机ip+port。
    3. listen——监听来电,若在监听到来电,则建立起连接。
    4. accept——再创建一个socket对象给其收发消息。原因是现实中服务端都是面对多个客户端,那么为了区分各个客户端,则每个客户端都需再分配一个socket对象进行收发消息。
    5. read、write——就是收发消息了。
  • 客户端

    1. socket——创建socket对象。
    2. connect——根据服务端ip+port,发起连接请求。
    3. write、read——建立连接后,就可发收消息了。
  • 如下图
    在这里插入图片描述

TCP网络编程

终端节点创建

  • 所谓终端节点就是用来通信的端对端的节点,可以通过ip地址和端口构造,其的节点可以连接这个终端节点做通信.
#include "boost/asio.hpp"
服务端(server)节点创建
  • 通过ipv6连接
int server_end_point()
{
	unsigned short port_num = 3333;
	boost::asio::ip::address ip_address = boost::asio::ip::address_v6::any();
	boost::asio::ip::tcp::endpoint ep(ip_address, port_num);
	return 0;
}
客户端(client)节点创建
int client_end_point() {
	//ip地址
	std::string raw_ip_address = "127.4.8.1";
	//端口号
	unsigned short port_num = 3333;
	//错误关键字
	boost::system::error_code ec;
	//通过服务端的ip地址、端口号获取通信地址
	boost::asio::ip::address ip_address = boost::asio::ip::address::from_string(raw_ip_address, ec);
	if (ec.value() != 0) {
		//有错误
		std::cout << "失败,ip.address.Error_code = " << ec.value() << "信息" << ec.message();
		return ec.value();
	}
	//创建连接;地址、端口
	boost::asio::ip::tcp::endpoint ep(ip_address, port_num);
	return 0;
}

创建socket

服务端端scoket创建
新版创建
  • 指定协议,端口连接;默认实现绑定
int create_acceptor_socket()
{
//上下文(通过上下文服务通信)(旧版本为io_service)
	boost::asio::io_context ios;
	boost::asio::ip::tcp::acceptor a(
		ios,
		boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 3333)
	);
	return 0;
}
旧版创建
int create_acceptor_socket()
{
	boost::asio::io_context ios;
	boost::asio::ip::tcp::acceptor acceptor(ios);
	//老版本需要进行以下操作
	//boost::asio::ip::tcp protocol = boost::asio::ip::tcp::v4();
	//boost::system::error_code ec;
	//acceptor.open(protocol, ec);
	//if (ec.value() != 0) {
	//	std::cout << "失败,ip.address.Error_code = " << ec.value() << "信息" << ec.message();
	//	return ec.value();
	//}
	return 0;
}
客户端scoket创建
int create_tcp_socket()
{
	//上下文(通过上下文服务通信)(旧版本为io_service)
	boost::asio::io_context ioc;
	//创建ipv4协议
	boost::asio::ip::tcp protocol = boost::asio::ip::tcp::v4();
	//创建socket
	boost::asio::ip::tcp::socket sock(ioc);
	boost::system::error_code ec;
	//测试是否成功
	sock.open(protocol, ec);
	if (ec.value() != 0) {
		std::cout << "失败,ip.address.Error_code = " << ec.value() << "信息" << ec.message();
		return ec.value();
	}
	return 0;
}

实现绑定(只有服务端)

  • 新版绑定:[[网络编程基本流程介绍#创建socket#新版创建]]
老版本
int bind_acceptor_socket()
{
	//省略一部分命名空间,简化以下代码,尽可能少的使用命名空间,防止冲突。
	using namespace boost;
	unsigned short port_num = 3333;
	//生成端点   接收任何地址的连接
	asio::ip::tcp::endpoint ep(asio::ip::address_v4::any(), port_num);
	//创建服务 确定绑定的服务。
	asio::io_context ios;
	asio::ip::tcp::acceptor acceptor(ios, ep.protocol());
	//手动绑定
	boost::system::error_code ec;
	acceptor.bind(ep, ec);
	//测试
	if (ec.value() != 0) {
		std::cout << "失败,ip.address.Error_code = " << ec.value() << "信息" << ec.message();
		return ec.value();
	}
	return 0;
}

连接操作(只有客户端)

通过ip地址链接
int connect_to_end()
{
	std::string raw_ip_address = "192.169.1.124";
	unsigned short port_num = 3333;
	try {
		boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string(raw_ip_address),port_num);
		boost::asio::io_context ios;
		//ep.protocol()确定协议
		boost::asio::ip::tcp::socket sock(ios, ep.protocol());
		sock.connect(ep);
	}
	catch (boost::system::system_error& e) {
		std::cout << "失败,ip.address.Error_code = " << e.code()<< "信息" << e.what();
		return e.code().value();

	}
	return 0;
}
通过域名链接
int dns_connect_to_end()
{
	std::string host = "llfc.club";
	std::string port_num = "3333";
	boost::asio::io_context ios;
	//创建查询器 ,参数列表(域名,端口,官方提供)
	boost::asio::ip::tcp::resolver::query resolver_query(host,
		port_num,
		boost::asio::ip::tcp::resolver::query::numeric_service);
	//生成域名解析器,绑定在ios这个上下文服务上
	boost::asio::ip::tcp::resolver resolver(ios);
	try {
		//解析返回迭代器,可以解析到的所有ip
		boost::asio::ip::tcp::resolver::iterator it = resolver.resolve(resolver_query);
		boost::asio::ip::tcp::socket sock(ios);
		boost::asio::connect(sock, it);
	}
	catch (boost::system::system_error& e) {
		std::cout << "失败,ip.address.Error_code = " << e.code() << "信息" << e.what();
		return e.code().value();
	}
	return 0;
}

服务端监听,接收连接

int accept_new_connection()
{
	using namespace boost;
	//监听队列的大小,(旧版按照tcp算法为:大小 * 2。目前肯定比设定大)
	const int BACKLOG_SIZE = 30;
	unsigned short port_num = 3333;
	//asio::ip::address_v4::any()  接受任何地址
	asio::ip::tcp::endpoint ep(asio::ip::address_v4::any(),port_num);
	asio::io_context ios;
	try {
		//生成接收器
		asio::ip::tcp::acceptor acceptor(ios,ep.protocol());
		//绑定
		acceptor.bind(ep);
		
		//监听
		acceptor.listen(BACKLOG_SIZE);
		//利用scoket与客户端通信
		asio::ip::tcp::socket sock(ios);
		//接收到的连接交给socket处理
		acceptor.accept(sock);
	}
	catch (system::system_error& e) {
		std::cout << "失败,ip.address.Error_code = " << e.code() << "信息" << e.what();
		return e.code().value();
	}
	return 0;
}

标签:asio,socket,ip,流程,编程,网络,tcp,address,boost
From: https://blog.csdn.net/weixin_62612279/article/details/140856787

相关文章

  • 解密编程的八大法宝(四)(附二分查找、分治法和图论算法(深度和广度优先搜索、最短路径、最
    算法题中常见的几大解题方法有以下几种::暴力枚举法(BruteForce):这是最基本的解题方法,直接尝试所有可能的组合或排列来找到答案。这种方法适用于问题规模较小的情况,但在大多数情况下效率不高。贪心算法(GreedyAlgorithm):贪心算法在每一步都选择当前看起来最优的解,希望最终能......
  • Langchain——chatchat3.1版本docker部署流程Langchain-Chatchat
    Langchain——chatchat3.1版本docker部署流程Langchain-Chatchat1.项目地址#项目地址https://github.com/chatchat-space/Langchain-Chatchat#dockerhub地址https://hub.docker.com/r/chatimage/chatchat/tags2.docker部署参考官方文档#官方文档https://github.com/......
  • Java流程控制语句结构中的循环结构
    循环结构目录循环结构while循环do...while循环for循环如果您想要同样的操作执行多次,就需要使用循环结构。Java中有三种主要的循环结构:while循环do…while循环for循环while循环while是最基本的循环,它的结构为:while(布尔表达式){//循环内容}只要布尔表达式......
  • 循环语句:解锁编程世界的无限迭代
    引言循环,它不仅仅是简单的重复,更是高效、优雅的代名词。无论是遍历数组、处理文件、模拟复杂系统,还是优化算法性能,循环都是不可或缺的基石。接下来将带您深入循环的奥秘,揭示其背后的工作原理,以及如何在编程实践中灵活运用,让您的代码在迭代中绽放光彩。循环流程图循环结构对......
  • 【网络安全】LockBit病毒入侵揭秘:如何防范与应对
    文章目录前言主要特征攻击手段演进历程主要威胁防范与对策==如何入门学习网络安全【黑客】==【----帮助网安学习,以下所有学习资料文末免费领取!----】大纲学习教程面试刷题资料领取前言在数字时代,随着科技的飞速发展,网络安全问题愈发凸显。恶意软件和勒索软件等网络......
  • 多线程编程
    目录思维导图:学习内容:1. 多线程基本概念2.多线程编程2.1 pthread_create:创建线程 2.2 pthread_self线程号的获取2.3 pthread_exit:线程退出函数课外作业:1、使用两个线程完成两个文件的拷贝,分支线程1拷贝前一半,分支线程2拷贝后一半,主线程回收两个分支线程的资......
  • Linux系统编程-临时文件
    临时文件:1、如何不冲突  2、及时销毁创建临时文件有两种方法:1、tmpnam  2、tmpfiletmpnam函数tmpnam的用法为一个临时文件创建一个名字。该方法创建临时文件,需要两步:1、产生文件名字   2、创建文件。所以从并发的角度,可能有两个用户获取同一个文件名字,因此......
  • 白盒测试基础与实践:Python示例及流程图设计
    文章目录前言一、白盒测试是什么?主要特点常用方法优点缺点二、白盒测试常用技术语句覆盖判定覆盖条件覆盖判定/条件覆盖条件组合覆盖路径覆盖三、程序流程图设计四、测试用例设计1.基本路径法2.语句覆盖3.判断覆盖4.条件覆盖5.判断/条件覆盖6.条件组合覆盖总结......
  • 【优点介绍】流程表单设计器开发为行业增效助力
    借助优质的平台产品,可以为行业发展提质、降本、增效。低代码技术平台性能功能多、够灵活可靠、可视化界面,是广泛用于中小型企业、实现流程化办公的理想产品。流程表单设计器开发优势特点多,伴随着行业的发展,迭代创新的步伐在加快,是提升效率的优质产品。随着科技的进步和社会的发展......
  • RocketMq 拉取数据流程源码分析
    从一个问题开始1、一个boker,一个主题,两个队列,一个消费者组,一个消费节点,此时两个队列是落在一个消费节点上,请问这个消费节点是如何拉取数据的?需要明确关键对象之间的关系。关键对象有:1、RebalancePushImpl---》队列经过相关负载均衡算法,最终哪些队列落在当前节点上2、DefaultM......