zoukankan      html  css  js  c++  java
  • 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......

  • 相关阅读:
    觅踪2
    构建之法阅读笔记08
    觅踪1
    暑期第四周学习周总结
    暑期第三周学习周总结
    暑期第二周学习周总结
    数据库程序设计第九天--整合总结
    数据库程序设计第八天--隔离人员权限
    数据库程序设计第七天--隔离地权限
    数据库程序设计第六天--管理员权限
  • 原文地址:https://www.cnblogs.com/black-mamba/p/7613321.html
Copyright © 2011-2022 走看看