标签:
今天验证了两个问题。
第一,backlog是不是填多少都生效。
第二,主程说登陆不上的问题是因为listen的队列满了,导致新连接连接不上,这个说法是否成立。
针对第一个问题,我翻阅了一些资料,得知这些是由操作系统底层决定的,对此,我在macbook和windows7上面都做了如下的实验。
服务器端:创建socket->填写sockaddr_in结构体->绑定监听地址和端口号->listen(socket, SOMAXCONN)->while(true){ ;}->end
客户端:while(true){创建socket->connect服务器}->end
在客户端中,每connect一次都打印一次计数变量(count++),都跑起来之后,发现在mac下connect到了128就堵塞了,而在windows7下面是到了200才堵塞。所以backlog并不是填多少都有效,是有限的,超过系统的上限,就会按照系统的上限来设置。
针对第二个问题,我把connect的错误打印出来了,错误10061。主程说的可是10036喔,还斩钉截铁的。然后我就很开心地去叼他,说我测出来队列满了的错误是10061,并不是10036。接着他问我,10061是什么鬼,我告诉他是”服务器拒绝服务“。他就说,他记错了,是10061!
什么鬼!还好我自己实践了一遍,不然按照他说的去找10036,都不知道找到猴年马月。
接着就能找到问题点了,队列满了,排除了SYN洪水攻击之外就是因为没有accept,正常来说是不会出现这个问题的。除非,负责accept那条线程挂掉了,才会这样子。好的,明天就去找找,看是否有可能会使那条线程挂了。
标签:
原文地址:http://my.oschina.net/chrisforbt/blog/474343