TCP/IP Socket网络编程心得

TCP/IP Socket网络编程心得:

  1. ET模式下accept
  • 考虑这种情况:多个连接同时到达,服务器的 TCP 就绪队列瞬间积累多个就绪连接,由于是边缘触发模式,epoll 只会通知一次,accept 只处理一个连接,导致 TCP 就绪队列中剩下的连接都得不到处理
  • 解决办法是用 while 循环抱住 accept 调用,处理完 TCP 就绪队列中的所有连接后再退出循环。如何知道是否处理完就绪队列中的所有连接呢? accept 返回 -1 并且 errno 设置为 EAGAIN 就表示所有连接都处理完
  1. 对端或本端close的处理
  • 对端close, 本端继续recv会返回0,send会返回-1
  • 本端close, 本端继续recv会返回-1,send会返回-1,errno都是EPIPE
  • close(fd)之后,可以通过fd发送或接收数据吗?如果调用了send或recv函数会报 Broken pipe的错误吗?
  • 添加signal(SIGPIPE,SIG_IGN); 以免报Broken Pipe的错误
  1. 使用ET和LT的区别
  • LT:水平触发,效率会低于ET触发,尤其在大并发,大流量的情况下。但是LT对代码编写要求比较低,不容易出现问题。LT模式服务编写上的表现是:只要有数据没有被获取,内核就不断通知你,因此不用担心事件丢失的情况
  • ET:边缘触发,效率非常高,在并发,大流量的情况下,会比LT少很多epoll的系统调用,因此效率高。但是对编程要求高,需要细致的处理每个请求,否则容易发生丢失事件的情况
  • 采用LT模式下,如果accept调用有返回就可以马上建立当前这个连接了,再epoll_wait等待下次通知,和select一样。 但是对于ET而言,如果accpet调用有返回,除了建立当前这个连接外,不能马上就epoll_wait还需要继续循环accpet,直到返回-1,且errno==EAGAIN

-- 2018/05/26
-- 魔都

你可能感兴趣的:(TCP/IP Socket网络编程心得)