AF_UNIX和AF_INET域的socket在epoll中的差异

1.AF_UNIX & SOCK_STREAM

1.1 accept_socket BLOCK EPOLLIN|EPOLLET

1.2 accept_socket NON-BLOCK EPOLLIN|EPOLLET

1.3 accept_socket BLOCK EPOLLIN

1.4 accept_socket NON-BLOCK EPOLLIN 

2.AF_INET & SOCK_STREAM

2.1 accept_socket NON-BLOCK EPOLLIN

2.2 accept_socket BLOCK EPOLLIN

2.3 accept_socket NON-BLOCK EPOLLIN|EPOLLET

2.4 accept_socket BLOCK EPOLLIN|EPOLLET

1 & 2的差异:

a. AF_UNIX 的SOCK_STREAM的socket read,可以 epoll_wait到EPOLLIN、EPOLLHUP。当client端write后,server端epoll_wait收到EPOLLIN后,read出数据;当client端写入10个字节的数据 close socket并退出,server端每次read只读出1个字节,那么就可能存在server端的数据读入不全,怎么解决呢?见如下示例:

由于是EPOLLET触发,是有当状态发生变化时,才会触发事件,所以当client端一次写入10个字节,server端只会触发一次event使epoll_wait返回,然后read1个字节,之后呢显示的EPOLL_CTL_MOD一次EPOLLIN|EPOLLHUP,epoll_wait会继续收到EPOLLIN事件,将所有以写入的数据读出。

当client端退出时,server端会收到EPOLLIN|EPOLLHUP的event;为了使epoll_wait阻塞,因为client端已经断开,所有server端也没有必要维护这个socket,所以EPOLL_CTL_DEL。

b.  当socket为BLOCK时,缓冲区的数据被读空后,read返回0;当socket为NON-BLOCK时,缓冲区的数据被读空后,read返回-1且errno==EAGAIN;

going on......

原文地址:https://www.cnblogs.com/black-mamba/p/7613321.html