• unix网络编程之listen()详解


    转自于:http://blog.csdn.net/ordeder/article/details/21551567

    Unix网络编程描述如下:

      #include <sys/socket.h>

      int listen(int sockfd,  int backlog);

        返回:若成功则为0,  若出错则为-1;

      本函数通常应该在调用socket和bind这两个函数之后,并在调用accept函数之前调用;

    为了理解其中的backlog参数,我们必须认识到内核为任何一个给定的监听套接字维护两个队列:

      (1)未完成连接队列(incomplete connection queue),每个这样的SYN分节对应其中一项:已由某个客户发出并到达服务器,而服务器正在等待完成相应的TCP三次握手过程,这些套接字处于SYN_RCVD状态;

      (2)已完成连接队列(completed connection queue),每个已完成TCP三次握手过程的客户端对应其中一项。这些套接字处于ESTABLISHED状态;

          

    总结:

      1、accept()函数不参与三次握手,而只负责从建立连接队列中取出一个连接和socketfd进行绑定;

      2、backlog参数决定了未完成队列和已完成队列中连接数目之和的最大值(从内核的角度,是否这个和就是等于sock->recv_queue ?);

      3、accept()函数调用,会从已连接队列中取出一个“连接”(可以说描述的数据结构listensocket->sock->recv_queue[sk_buff] ? ),未完成队列和已完成队列中连接数    目之和将减少1;即accept将监听套接字对应的sock的接收队列中的已建立连接的sk_buff取下(从该sk_buff中可以获得对端主机的发送过来的tcp/ip数据包)
      4、 监听套接字的已完成队列中的元素个数大于0,那么该套接字是可读的。
      5、 当程序调用accept的时候(设置阻塞参数),那么判定该套接字是否可读,不可读则进入睡眠,直至已完成队列中的元素个数大于0(监听套接字可读)而唤起监听进程)

  • 相关阅读:
    移动触摸事件之二
    移动touch事件之一
    Phonegap创建项目语法
    JS自定义去除字符串左右两边的指定字符
    video标签常用属性及说明
    html5开发之viewport使用
    页面事件总结
    缓存与预取
    修改JQM的默认配置属性
    JQM事件详解
  • 原文地址:https://www.cnblogs.com/chris-cp/p/4022262.html
Copyright © 2020-2023  润新知