首页 > Web开发 > 详细

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

时间:2017-09-30 09:47:54      阅读:534      评论:0      收藏:0      [点我收藏+]

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......

 

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

原文:http://www.cnblogs.com/black-mamba/p/7613321.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!