基于VS2019 C++的跨平台(Linux)开发(2.7)——服务器SOCKET封装

基于VS2019 C++的跨平台(Linux)开发(2.7)——服务器SOCKET封装一 TCP 编程通信本质 处理三个半事件 建立连接 服务器 accept 等待客户端 客户端 connect 连接服务器 断开连接 主动断开 close shutdown 被动断开 read 返回 0 消息到达 接收数据 read 对它的处理方式决定了网络编程的风格 阻塞还是非阻塞 如何处理分包 应用层的缓冲如何设计等等

大家好,我是讯享网,很高兴认识大家。

一、TCP编程通信本质——处理三个半事件

  1. 建立连接——服务器accept等待客户端、客户端connect连接服务器
  2. 断开连接——主动断开close、shutdown、被动断开read返回0
  3. 消息到达——接收数据read(对它的处理方式决定了网络编程的风格(阻塞还是非阻塞,如何处理分包,应用层的缓冲如何设计等等)
  4. 消息发送完毕——发送数据write(算半个事件)

二、面向对象方式封装

  • IO类封装―—读写二次封装  ——读写重载
  • 地址类(CHostAddress)——地址偏移
  • socket接口基类(CBaseSocket)——TCP类和UDP类(未涉及UDP类,不写)
  • TCP服务类(CTcpSever)——继承CBaseSocket
  • epoll多路复用类(CTEpollServer)

以上几者的包含关系如下图


讯享网

 所以main函数只需要创建一个CEpollServer类对象即可

注意:

1、如何调用以上类?

未写epoll封装类时,直接创建TCP服务类对象,并访问start函数即可,否则直接创建epoll类对象并访问

2、acceptfd有返回就代表一定有数据吗?

没有数据,只是代表客户端,accept后将fd放到事件队列等待队列,去等客户端的write。当数据传回服务器端,会触发事件,移到就绪队列,先进先出

3、客户端的什么操作触发accept的返回?—— connect函数

三、什么是高并发服务器

1、高:同时连上的客户端数量高——用epoll多路IO复用技术处理

2、并发:能够同时处理多个客户端发来的请求,使用线程池(后续进行线程封装),只用epoll的话当多个客户端到来的时候,需要"排队",客户端就会吐槽服务器垃圾(epoll只起到类似迎宾小姐进行“接待”的作用,不进行业务处理)

epoll中有等待队列和就绪队列,当就绪队列中出现多个待处理业务时,就需要达到可以同时处理的效果,即并发。

四、内存大小端

32bit宽的16进制0x在内存中的大小端存放方式如下

大端模式一一高位字节存低地址,低位字节存高地址

内存地址 0x4000 0x4001 0x4002 0x4003
存放内容 0x12 0x34 0x56 0x78

小端模式一一高位字节存高地址,低位字节存低地址

内存地址 0x4000 0x4001 0x4002 0x4003
存放内容 0x78 0x56 0x34 0x12

1、大小端应用——htons()函数

  • 函数功能:将无符号短整型变量从主机字节顺序转变成网络字节顺序,即大端模式。(主机字节就是小端地址)
  • 为什么用这个函数?因为window和linux下数据存放的方式(大小端)可能不一致,所以在 window(小端)下把端口号设置成10086的时候需要用到htons ,转换成“网络字节序"
  • 从软件的角度上看,不同端模式的处理器进行数据传递时必须要考虑端模式的不同。如进行网络数据传递时,必须要考虑端模式的转换。

2、字节占用

  • 一个字节=8位的二进制数,例如 int为4个字节,占32位。
  • 32位的int: 0000 0000 0000 0000 0100

补充:

1、如何快速生成set、get函数

2、ifndef,endif是为了避免重复导包,#pragma once也是

小讯
上一篇 2025-03-08 18:46
下一篇 2025-03-14 22:29

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/123427.html