当前位置: 首页 > news >正文

青岛网站建设与管理宁德市公共资源交易中心

青岛网站建设与管理,宁德市公共资源交易中心,ui设计作品解析,哪个网站可以做英文兼职socket的创建和连接 tcp客户端创建端点tcp服务端创建端点创建socket创建TCP 服务器端的 acceptor 套接字创建 acceptor 套接字并绑定客户端连接到服务器通过ip地址解析通过域名解析 服务端接收新连接 tcp客户端创建端点 int client_end_point() {std::string raw_ip_address …

socket的创建和连接

  • tcp客户端创建端点
  • tcp服务端创建端点
  • 创建socket
  • 创建TCP 服务器端的 acceptor 套接字
  • 创建 acceptor 套接字并绑定
  • 客户端连接到服务器
    • 通过ip地址解析
    • 通过域名解析
  • 服务端接收新连接

tcp客户端创建端点

int client_end_point()
{std::string raw_ip_address = "127.0.0.1";unsigned short prot_num = 8888;boost::system::error_code ec;boost::asio::ip::address ip_address = boost::asio::ip::address::from_string(raw_ip_address, ec);if (ec.value() != 0){std::cout << "Failed to parse the IP address.Error code = " << ec.value() << ".Message is " << ec.message();return ec.value();}boost::asio::ip::tcp::endpoint endpoint(ip_address, prot_num);return 0;
}

  std::string raw_ip_addressunsigned short prot_num分别代表了ip地址和端口号,其中127.0.0.1为本地回环地址,也叫做localhost
  cboost::system::error_code ec用来表示可能出现的错误。Boost.Asio 使用这个对象来存储错误信息,例如网络操作中可能发生的错误
  boost::asio::ip::address ip_address = boost::asio::ip::address::from_string(raw_ip_address, ec);则是将字符串类型的ip地址解析为boost库中更为通用的boost::asio::ip::address 类型的对象
  boost::asio::ip::tcp::endpoint endpoint(ip_address, prot_num);该语句使用ip_address 和prot_num 创建了一个 TCP 端点(tcp::endpoint)。端点是网络通信中表示地址和端口的对象,通常用于设置连接目标。ip_address 是通过前面解析得到的 IP 地址。prot_num 是端口号,表示服务监听的端口。

tcp服务端创建端点

int server_end_point()
{unsigned port_num = 8888;//端口号boost::asio::ip::address ip_address = boost::asio::ip::address_v6::any();boost::asio::ip::tcp::endpoint endpoint(ip_address, port_num);return 0;
}

  boost::asio::ip::address_v6::any() 是一个特殊的 IPv6 地址,表示任意可用的地址,通常用于服务器端监听所有可用的 IPv6 地址。如果是 IPv4 地址的话,则使用 boost::asio::ip::address_v4::any()

创建socket

int create_tcp_socket()
{boost::asio::io_context ioc;boost::asio::ip::tcp protocol = boost::asio::ip::tcp::v4();boost::system::error_code ec;boost::asio::ip::tcp::socket sock(ioc);sock.open(protocol, ec);if (ec.value() != 0){std::cout<< "Failed to open the socket! Error code = "<< ec.value() << ". Message: " << ec.message();return ec.value();}return 0;
}

  boost::asio::io_context 是 Boost.Asio 中用于执行异步操作的核心对象。它是所有异步操作的调度中心,负责调度和执行异步事件

boost::asio::ip::tcp protocol = boost::asio::ip::tcp::v4();

  这段代码主要意思是选择TCP协议的版本,当使用tcp::v4()代表使用的是TCP协议的IPV4版本,如果使用的是tcp::v6()则代表选择的是IPV6

boost::asio::ip::tcp::socket sock(ioc);

  以上代码创建了一个 boost::asio::ip::tcp::socket 类型的套接字对象 sock。该套接字是基于之前创建的 ioc(io_context)对象进行初始化的。ioc 是 io_context 对象,它在后台驱动异步操作,而套接字则是与网络通信的实体,能够接收和发送数据

sock.open(protocol, ec);

  sock.open(protocol, ec) 尝试打开一个 TCP 套接字。这里的 protocol 是之前定义的 IPv4 协议(boost::asio::ip::tcp::v4())
  如果打开成功,sock 将变为可用状态,允许进行后续的读写操作。如果失败,ec 将保存错误码和错误信息

创建TCP 服务器端的 acceptor 套接字

int create_acceptor_socket()
{boost::asio::io_context ioc;boost::asio::ip::tcp::acceptor acceptor(ioc);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 << "false" << std::endl;return ec.value();}return 0;
}
boost::asio::ip::tcp::acceptor acceptor(ioc);

  boost::asio::ip::tcp::acceptor 是一个用于监听客户端连接请求的对象。在这里,acceptor 对象会依赖于 ioc(io_context)来执行其异步操作。acceptor 的作用是等待客户端发起连接,并接受连接。

boost::asio::ip::tcp protocol = boost::asio::ip::tcp::v4();

  boost::asio::ip::tcp::v4() 表示使用 IPv4 协议类型。这里创建了一个表示 IPv4 协议的 protocol 对象。可以理解为告诉 acceptor 套接字它应该使用 IPv4 协议来进行通信。
  Boost.Asio 同时支持 IPv4 和 IPv6,这里选择了 v4(),意味着服务器将只监听 IPv4 地址

acceptor.open(protocol, ec);

  以上代码 是用来打开 acceptor 套接字的函数。在这里,protocol 参数指定了使用的协议(IPv4),ec 用于捕获错误代码。该操作会尝试在指定协议(IPv4)下打开一个套接字,并让其开始监听传入连接的请求。
  如果 acceptor.open() 操作失败,错误信息会被记录在 ec 中。
  这段代码并没有绑定 acceptor 到具体的地址和端口。通常情况下,acceptor.open() 之后,还需要通过 acceptor.bind() 或直接在 acceptor 构造函数中指定一个端点(IP 地址和端口)来完成绑定
  还有一种更加方便的方式创建acceptor 套接字

int create_acceptor_socket()
{boost::asio::io_context ioc;boost::asio::ip::tcp::acceptor a(ioc,boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(),8888));
return 0;
}

acceptor的构造函数接收了两个参数

  1. ioc:即之前创建的 boost::asio::io_context 对象。acceptor 需要依赖它来执行后续的 I/O 操作。
  2. boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 8888):这是一个 endpoint 对象,表示监听的具体地址和端口

创建 acceptor 套接字并绑定

int bind_acceptor_socket()
{boost::asio::io_context ioc;unsigned short prot_num = 8888;boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address_v4::any(), prot_num);boost::asio::ip::tcp::acceptor a(ioc, ep.protocol());boost::system::error_code ec;a.bind(ep,ec);if (ec.value() != 0) {std::cout << "Failed to bind the acceptor socket."<< "Error code = " << ec.value() << ". Message: "<< ec.message();return ec.value();}return 0;
}

为什么这里没有对acceptor的open操作?
  通常情况下,open 操作用来显式地打开一个套接字并指定其协议类型。在之前创建boost::asio::ip::tcp::acceptor对象时只传递了一格参数ioc而没有指定协议类型(是IPV4还是IPV6?),所以需要手动显示open,但是这里boost::asio::ip::tcp::acceptor a(ioc, ep.protocol());创建时传递了协议类型,它就是在构造函数中自动完成open操作

客户端连接到服务器

通过ip地址解析


int connect_to_end()
{unsigned short prot_num = 8888;std::string ip = "127.0.0.1";try{boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string(ip), prot_num);boost::asio::io_context ioc;boost::asio::ip::tcp::socket sock(ioc, ep.protocol());sock.connect(ep);}catch (const boost::system::system_error& e){std::cout << "Error occured! Error code = " << e.code() << ".Message:" << e.what();return e.code().value();}return 0;
}

通过域名解析

int dns_connect_to_end()
{std::string host = "www.baidu.com";std::string port_num = "8888";boost::asio::io_context ioc;boost::asio::ip::tcp::resolver::query resolver_query(host, port_num, boost::asio::ip::tcp::resolver::query::numeric_service);boost::asio::ip::tcp::resolver resolver(ioc);try{boost::asio::ip::tcp::resolver::iterator it = resolver.resolve(resolver_query);boost::asio::ip::tcp::socket sock(ioc);boost::asio::connect(sock, it);}catch (boost::system::system_error& e){std::cout << "Error occured! Error code = " << e.code() << ".Message:" << e.what() << std::endl;return e.code().value();}return 0;
}
boost::asio::ip::tcp::resolver::query resolver_query(host, port_num, boost::asio::ip::tcp::resolver::query::numeric_service);

  这里创建了一个 resolver_query 对象,指定了要解析的域名 host 和端口号 port_num。
  boost::asio::ip::tcp::resolver::query 是 Boost.Asio 中用于描述解析查询的类,它包含了域名和端口信息,告诉解析器要解析哪个主机的 IP 地址。
  boost::asio::ip::tcp::resolver::query::numeric_service 表示请求解析服务的端口号为数值类型,确保解析器解析的是数字形式的端口号。

boost::asio::ip::tcp::socket sock(ioc);
boost::asio::connect(sock, it);

  boost::asio::ip::tcp::socket sock(ioc) 创建了一个 TCP 套接字 sock,并使用 ioc(I/O 服务对象)进行初始化。
  boost::asio::connect(sock, it) 尝试连接到解析出来的第一个 IP 地址。这里,it 是从 resolver.resolve() 返回的迭代器,表示解析到的 IP 地址列表。connect 会逐个尝试列表中的 IP 地址,直到找到一个能够成功连接的地址。

服务端接收新连接

int accept_new_connection()
{const int BACKLOG_SIZE = 30;boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address_v4::any(), 8888);boost::asio::io_context ioc;try{boost::asio::ip::tcp::acceptor ac(ioc,ep.protocol());ac.bind(ep);ac.listen(BACKLOG_SIZE);boost::asio::ip::tcp::socket sock(ioc);ac.accept(sock);}catch (boost::system::system_error& e){std::cout << "Error occured! Error code = " << e.code() << ".Message:" << e.what() << std::endl;return e.code().value();}return 0;
}

  BACKLOG_SIZE 设置为 30,表示服务器在等待连接时能够排队的最大连接数。这是 TCP 协议栈的一个参数,通常设置为比实际预期连接数稍大的值,防止过多的连接被拒绝。

boost::asio::ip::tcp::socket sock(ioc);
ac.accept(sock);

  boost::asio::ip::tcp::socket sock(ioc); 创建一个新的 TCP 套接字 sock,用于与连接的客户端进行通信。这个套接字是通过 ioc(I/O 上下文)初始化的。
  ac.accept(sock); 调用 accept() 方法等待接受客户端的连接。当有客户端尝试连接到指定端口时,accept() 会阻塞直到接收到连接请求。成功后,sock 就与客户端建立了连接,并且可以用它来进行数据传输。

http://www.ds6.com.cn/news/114807.html

相关文章:

  • 做机械加工外贸网站哪家好百度网络推广怎么做
  • 自己创业做网站百度统计平台
  • 破解wordpress的密码爱站网站seo查询工具
  • 怎么在网上做网站百度自动点击器
  • 网站建设网站制作需要多少钱杭州seo公司
  • 网站建设个人工作室百度刷排名seo软件
  • 百度商桥可以在两个网站放外贸seo软件
  • 做前端网站考虑兼容分辨率seo咨询岳阳
  • 网站公司怎么做业务关键词排名怎么快速上去
  • 什么网站可以查建设用地规划许可证seo课程总结
  • 今日兰州疫情最新消息windows优化大师绿色版
  • 用dw做网站图片的基本尺寸360优化大师官方最新
  • 苏州园区公积金管理中心官网成都自然排名优化
  • 自己创建网站怎么做电商南宁最新消息今天
  • 网站怎么做qq微信登陆界面seo关键词排名优化技巧
  • jsp网站建设作业自己搜20条优化措施
  • 专业的开发网站建设价格营销中存在的问题及对策
  • 简历设计网官网优化设计答案
  • 网站优化关键词排名公司推推蛙seo
  • 深圳做网站外包公司网络外贸推广
  • 淘宝上做的网站靠谱吗seo网站优化详解
  • 杭州网站建设模板如何提高网站排名seo
  • 中企高呈高端网站建设费用我们seo
  • 线下教育机构seo推广方法
  • wordpress 专业模板关键词排名优化怎么样
  • 哪里有网站建设怎么开设自己的网站
  • 云空间网站开发网络营销外包推广定制公司
  • 中国建设银行掌上银行官方网站如何推广自己的店铺
  • 西安网站建设中心网站数据统计工具
  • 良乡网站建设网络营销类型有哪些