一、TCP编程通信本质——处理三个半事件
- 建立连接——服务器accept等待客户端、客户端connect连接服务器
- 断开连接——主动断开close、shutdown、被动断开read返回0
- 消息到达——接收数据read(对它的处理方式决定了网络编程的风格(阻塞还是非阻塞,如何处理分包,应用层的缓冲如何设计等等)
- 消息发送完毕——发送数据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也是



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