问题1: server和client都能正常运行,但是不能通信?

问题排查:
1.连接是可以正常建立的。
服务器感知不到连接。
客户端连接后发送不出消息

丢失

  1. epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev);

模型架构

C/S模型

image.png

函数解析

socket套接字

创建TCP或者UDP套接字

  1. int socket(int af, int type, int protocol);

af (address faimly), 也可用 PF(protocol family) 为前缀,协议族, 有AF_INET、PF_INET(IPV4)、AF_INET6、PF_INET6(IPV6)等,

type 数据传输方式,有 SOCK_STREAM(流套接字)、SOCK_DGRAM(数据报套接字)等

protocol 协议类型, 有 IPPROTO_TCP(TCP协议)、IPPROTO_UDP(UDP协议),将此位置0,系统自己选择使用哪种协议。

sockaddr_in

bind

listen

accept

从队列中取出套接字

sprintf

epoll

1.调用epoll_create函数在Linux内核中创建一个事件表。 2.调用epoll_ctl将文件描述符(比如套接字listener)添加到所创建的事件表中。 3.调用epoll_wait返回就绪的文件描述符集合 4.对事件进行处理

流程解析

客户端


简要介绍

  • 基于C/S模型,采用TCP连接
  • 使用Epoll边沿触发的IO多路复用技术实现并发,非阻塞IO
  • 服务器能够接收客户端连接,并将客户端发过来的消息进行群发
  • 客户端能够连接服务器,向服务器发送消息和接收消息

  1. chat_room是什么?

一个基于C++的聊天室实现,实现了服务端,客户端,具备多客户端同时连接,同时收发信息的广播功能。
服务端:接收客户端的连接,将客户端发送的消息转发给其他客户端。
客户端:连接服务器,将消息发送给服务器,并接收来自其他客户端的消息。


面试可能会问的问题:

  1. 为什么用epoll?
  2. epoll、select和poll有什么区别?

1、select,每次都要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大,;在内核遍历所有fd,具有O(n)的无差别轮询复杂度;支持的文件描述符很小,是1024;2、poll,在select的基础上,是通过链表来存储的;3、epoll可以理解为eventpoll,事件驱动;1G内存,大概可以打开10万个链接,通过内核和用户空间共享内存。
在连接数少并都十分活跃的情况下,select和poll的性能会高于epoll,因为epoll包含很多函数回调。

  1. 边缘触发ET和水平触发LT的区别? 水平触发LT比较低效,是select/poll使用的触发方式(只要有数据可读,就会一直返回,因此一定要把数据读完); ET是高效方式(只通知一次,直到下次状态改变,可以只读取自己关心的文件描述符)
  2. socket设置为非阻塞方式,这样能充分利用服务器资源;
  3. 服务器端是长连接还是短连接?单进程还是多进程
  4. 服务器从接收到转发是同步还是异步?
  5. HTTP状态码 3XX 4XX 5XX