最近在写一个实验代码,学习epoll的TCP和UDP底层技术。
当我编写 TCP 代码时,一切正常。我向网站发送请求以获取一些消息。
1. Poll event EPOLLOUT
Success to connect
New connection construct
2. Poll event EPOLLOUT
Send TCP request
3. Poll event EPOLLIN | EPOLLOUT
Call tcp message callback
第一个 EPOLLOUT(1) 表示连接已完成,第二个 EPOLLOUT(2) 表示 EPOLLOUT 事件已添加到 epollfd,第三个 EPOLLIN | EPOLLOUT(3)表示已收到消息,发送缓冲区可以再次使用。
但是当我编写UDP代码时,发生了我无法理解的事情。
1. Poll event EPOLLOUT
Success to connect
New connection construct
2. Poll event EPOLLOUT
Send UDP request
3. Poll event EPOLLOUT
4. Poll event EPOLLIN | EPOLLOUT
Call tcp message callback
1,2,4与TCP代码中的1,2,3相同,但3是我无法理解的东西。我上面发送的数据都是小数据。 为什么我发送udp请求后又收到EPOLLOUT?
EPOLLOUT 仅仅意味着可以写入。引用 epoll_ctl:“关联文件可用于 write(2) 操作”。写入只是将数据放入发送缓冲区,最终由内核将数据传输到对等方。发送缓冲区通常足够大,可以容纳多条消息(取决于消息的大小),因此一次又一次获得 EPOLLOUT 是很正常的。
EPOLLIN 只是意味着 “关联的文件可用于 read(2) 操作”。如果可能的话,读取是通过从接收缓冲区检索数据来完成的,因此 EPOLLIN 只是意味着接收缓冲区中有可用数据,读取不会阻塞,而是会带着这些数据返回。
...以及第三个 EPOLLIN | EPOLLOUT(3)表示已收到消息,发送缓冲区可以再次使用
EPOLLIN、EPOLLOUT 或任何其他事件都没有说明对等点实际收到的消息。