关于网络编程中的backlog

看《Unix网络编程》,15章有个习题,说当backlog分别等于0,1,2...14时,系统内核真正的已完成队列长度极限是多少。我就写了个小程序来验证。


系统:redhat 5 server 64

程序:服务端,客户端在一台机器上。服务端listen后,不去accept,让完成三次握手的tcp套接字继续呆在已完成队列。客户端持续创建新socket去connet,并且connect超时时间设置为2秒。


结果:

当服务端listen(fd, 0)的时候,最多连了3个。

当服务端listen(fd, 1)的时候,一直可以connect上。我从打印出来的信息看,都过了280了还在继续连。


这很让我感到奇怪!为什么呢?


解决:

经过检查,发现是客户端的定时器只设置了一次。应该每次connect前都要alarm(2)。改完后,结果如下:

backlog=0, maxconn=3;

backlog = i, maxconn = i + 2; (i > 0)

你可能感兴趣的:(关于网络编程中的backlog)