listen(等待连接)
相关函数 socket,bind,accept,connect
表头文件 #include<sys/socket.h>
相关函数 socket,bind,accept,connect
表头文件 #include<sys/socket.h>
定义函数 int listen(int s,int backlog);
Listen()并未开始接收连接,只是设置socket为listen模式,真正接收client端连接的是accept()。通常listen()会在socket(),bind()之后调用,接着才调用accept()。
listen的第二个参数并不是用来限制程序的最大连接数的。而是TCP模块允许的已完成三次握手过程(TCP模块完成),但还没来得及被应用程序accept的最大链接数。
举例来说假说你的服务器很忙或干脆暂停了,这时如果有四个TCP客户端尝试TCP链接过来,而listen的第二个参数backlog为3,则底层TCP模块会依次完成前面3个客户端的握手过程,并把其放入一个缓存区中等待服务器应用程序的accept(此时这三个客户程序的connect会调用成功表示链接已建立)。对于第四个链客户端,TCP模块什么也不做,也不会返回icmp数据包。
实际上第四个链接已被TCP模块丢弃。假如此时服务器还在暂停之中但客户端的connect已成功返回则客户端会认为可以向服务器发送数据了,这此数据会被服务器端的TCP模块缓存下来,待服务器程序从暂停中恢复过来时读取.