linux下的listen 第二个参数为什么没用?
我写了一个echo的tcp服务器(客服发什么消息,服务回什么消息),listen设置为3,我理解的是,只能有3个客户端连接,可是我不论建立几个客户端都能登陆,都能得到回应...
我写了一个echo 的 tcp服务器(客服发什么消息,服务回什么消息),listen 设置为3, 我理解的是,只能有3个客户端连接,可是我不论建立几个客户端都能登陆,都能得到回应,这是为什么啊?那第二个参数到底有什么用啊?
展开
1个回答
展开全部
listen的第二个参数并不是用来限制程序的最大连接数的。
而是TCP模块允许的已完成三次握手过程(TCP模块完成)但还没来得及被应用程序accept的最大链接数.
举例来说假说你的服务器很忙或干脆暂停了,这时如果有四个TCP客户端尝试TCP链接过来,而你listen的第二个参数为3,则底层TCP模块会依次完成前面3个客户端的握手过程,并把其放入一个缓存区中等待服务器应用程序的accept(此时这三个客户程序的connect会调用成功表示链接已建立)。对于第四个链客户端,TCP模块什么也不做,也不会返回icmp数据包。实际上第四个链接已被TCP模块丢弃。假如此时服务器还在暂停之中但客户端的connect已成功返回则客户端会认为可以向服务器发送数据了,这此数据会被服务器端的TCP模块缓存下来,待服务器程序从暂停中恢复过来时读取.
而是TCP模块允许的已完成三次握手过程(TCP模块完成)但还没来得及被应用程序accept的最大链接数.
举例来说假说你的服务器很忙或干脆暂停了,这时如果有四个TCP客户端尝试TCP链接过来,而你listen的第二个参数为3,则底层TCP模块会依次完成前面3个客户端的握手过程,并把其放入一个缓存区中等待服务器应用程序的accept(此时这三个客户程序的connect会调用成功表示链接已建立)。对于第四个链客户端,TCP模块什么也不做,也不会返回icmp数据包。实际上第四个链接已被TCP模块丢弃。假如此时服务器还在暂停之中但客户端的connect已成功返回则客户端会认为可以向服务器发送数据了,这此数据会被服务器端的TCP模块缓存下来,待服务器程序从暂停中恢复过来时读取.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询