问题1: server和client都能正常运行,但是不能通信?
问题排查:
1.连接是可以正常建立的。
服务器感知不到连接。
客户端连接后发送不出消息
丢失
epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev);
模型架构
C/S模型
函数解析
socket套接字
创建TCP或者UDP套接字
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
- 服务器能够接收客户端连接,并将客户端发过来的消息进行群发
- 客户端能够连接服务器,向服务器发送消息和接收消息
- chat_room是什么?
一个基于C++的聊天室实现,实现了服务端,客户端,具备多客户端同时连接,同时收发信息的广播功能。
服务端:接收客户端的连接,将客户端发送的消息转发给其他客户端。
客户端:连接服务器,将消息发送给服务器,并接收来自其他客户端的消息。
面试可能会问的问题:
- 为什么用epoll?
- epoll、select和poll有什么区别?
1、select,每次都要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大,;在内核遍历所有fd,具有O(n)的无差别轮询复杂度;支持的文件描述符很小,是1024;2、poll,在select的基础上,是通过链表来存储的;3、epoll可以理解为eventpoll,事件驱动;1G内存,大概可以打开10万个链接,通过内核和用户空间共享内存。
在连接数少并都十分活跃的情况下,select和poll的性能会高于epoll,因为epoll包含很多函数回调。
- 边缘触发ET和水平触发LT的区别? 水平触发LT比较低效,是select/poll使用的触发方式(只要有数据可读,就会一直返回,因此一定要把数据读完); ET是高效方式(只通知一次,直到下次状态改变,可以只读取自己关心的文件描述符)
- socket设置为非阻塞方式,这样能充分利用服务器资源;
- 服务器端是长连接还是短连接?单进程还是多进程
- 服务器从接收到转发是同步还是异步?
- HTTP状态码 3XX 4XX 5XX