epoll问题整理
发布网友
发布时间:2024-10-11 07:17
我来回答
共1个回答
热心网友
时间:2024-11-17 20:13
epoll_wait返回事件包括可读事件(EPOLLIN)和可写事件(EPOLLOUT)。添加可写事件的方法有两种:直接在可读事件回调函数中发送数据,或在可读事件后为对应文件描述符添加可写事件,等待epoll_wait触发后发送。采用后者的目的是为了避免其他文件描述符在使用send缓冲区时引发冲突。
在处理数据时,若数据不全,可以为每个文件描述符封装状态:文件描述符、回调函数、send缓冲、send长度、recv缓冲、recv长度。读取可读事件时,使用recv函数的recv缓冲和recv长度参数。触发可写事件时,根据recv缓冲中的内容处理后,将要发送的内容写入send缓冲,再调用send函数。
服务器建立连接至百万时,客户端出现"cannot assign address"错误。原因可能是用户可用端口已满或文件描述符数量限制。解决方法包括调整用户端口范围或增加文件描述符数量,或在服务器端启动多个监听fd,客户端使用不同目的端口。
客户端连接服务器时出现连接超时错误。可能原因包括文件描述符不足、端口数量限制或全连接队列满。可能的原因是客户端netfilter控制了连接请求发送,当连接数量达到一定阈值后不允许发送更多连接。解决方法是调整netfilter的连接数量上限。
连接服务器时出现抖动现象。这是由于accept是单线程处理,有排队情况,造成fd堆积,处理完当前堆积的fd后,会快速上升,形成抖动。解决方法是使用多线程处理listen的全连接队列,避免fd冲突。
WebSocket是一种基于TCP的长连接协议。服务器主动向浏览器发送数据时可使用WebSocket,如网页聊天、即时通讯等。WebSocket握手过程中,客户端发送Sec-WebSocket-key,服务端通过SHA-1哈希并进行base64编码后返回Sec-WebSocket-Accept,用于验证握手合法性。
WebSocket引入状态机用于管理协议状态,包括握手、通信和终止。状态机定义了各状态间的转换逻辑和处理流程,通过枚举类型封装到每个fd对应的结构中,实现对不同协议状态的处理。数据传输时,WebSocket数据头包含操作码、长度信息和Mask-key,用于加密数据,确保传输安全。