我一直工作在一些服务器客户端代码最近,我发现了一个非常混乱的疑难问题有server
监听端口,并设置积压= 2,和我的客户创建5个线程至connect
。的Mac OSX 10.9监听要完成的工作无法正常
在man
,我注意到
The backlog parameter defines the maximum length for the queue of pending connections. If a connection request arrives with the queue full, the client may receive an error with an indication of ECONNREFUSED. Alterna- tively, if the underlying protocol supports retransmission, the request may be ignored so that retries may succeed.
这意味着我的客户端连接将失败或重试以后。
但是当我的客户端运行时,它只是得到一个SIGPIPE信号而失败。
所以我跑sudo tcpdump -ilo0 port 10000
,并得到结果:
summertekiMacBook-PRO:选择夏天$ sudo的tcpdump的-ilo0端口10000
的tcpdump:详细的输出抑制,使用-v或-vV全协议解码侦听lo0,链路类型NULL(BSD环回),捕获大小65535字节
10:29:16.396240 IP localhost.56347> localhost.ndmp:Flags [S],seq 3366561899,win 65535,options [mss 16344,nop,wscale 4,nop,nop,TS val 396158772 ecr 0,sackOK,eol],长度0
10:29:16.396241 IP localhost.56349> localhost.ndmp:Flags [S],seq 902832276,win 65535,options [mss 16344,nop,wscale 4,nop,nop,TS val 396158772 ecr 0,sackOK ,eol],长度0
10:29:16.396242 IP localhost.56351> localhost.ndmp:Flags [S],seq 1956535575,win 65535,options [mss 16344,nop,wscale 4,nop,nop,TS VAL 396158772 ECR 0,sackOK,EOL],长度为0
10:29:16.396244 IP localhost.56348> localhost.ndmp:旗[S],SEQ 2161003109,赢得65535,期权[MSS 16344,NOP,wscale 4 ,nop,nop,TS val 396158772 ecr 0,sackOK,eol],长度0
10:29:16.396246 IP localhost.56350> localhost.ndmp:Flags [S],seq 1318035540,win 65535,options [mss 16344,nop,wscale 4,nop,nop,TS val 396158772 ecr 0,sackOK,eol] ,长度0
10:29:16.396296 IP localhost.ndmp> localhost.56347:Flags [S.],seq 2871094527,ack 3366561900,win 65535,options [mss 16344,nop,wscale 4,nop,nop, TS VAL 396158772 ECR 396158772,sackOK,EOL],长度为0
10:29:16.396307 IP localhost.ndmp> localhost.56351:旗[S.],SEQ 3931313020,ACK 1956535576,赢得65535,期权[MSS 16344 ,nop,wscale 4,nop,nop,TS val 396158772 ecr 396158772,sackOK,eol],长度0
10:29:16.396332 IP localhost.ndmp> localhost .56349:标记[S.],seq 3467781056,ack 902832277,获胜65535,选项[mss 16344,nop,wscale 4,nop,nop,TS val 396158772 ecr 396158772,sackOK,eol],长度0
10 :29:16.396349 IP localhost.ndmp> localhost.56348:Flags [S.],seq 2666080832,ack 2161003110,win 65535,options [mss 16344,nop,wscale 4,nop,nop,TS val 396158772 ecr 396158772,sackOK, eol],长度0
10:29:16.396366 IP localhost.ndmp> localhost。56350:Flags [S.],seq 2467582351,ack 1318035541,win 65535,options [mss 16344,nop,wscale 4,nop,nop,TS val 396158772 ecr 396158772,sackOK,eol],长度0
10: 29:16.396375 IP localhost.56347> localhost.ndmp:旗,ACK 1,赢得9186,选项[NOP,NOP,TS VAL 396158772 ECR 396158772],长度为0
10。]:29:16.396381 IP本地主机。 56351> localhost.ndmp:标志[。],ack 1,win 9186,选项[nop,nop,TS val 396158772 ecr 396158772],长度0
10:29:16.396386 IP localhost.56349> localhost.ndmp: Flags [。],ack 1,win 9186,选项[nop,nop,TS val 396158772 ecr 396158772],长度0
10:29:16.396391 IP localhost.56348> localhost.ndmp:[]旗,ACK 1,赢得9186,选项[NOP,NOP,TS VAL 396158772 ECR 396158772],长度为0
10时29分:16.396398 IP localhost.56350> localhost.ndmp:Flags [。],ack 1,win 9186,options [nop,nop,TS val 396158772 ecr 396158772],长度0
10:29:16.396408 IP localhost.ndmp > localhost.56347:旗[R],SEQ 2871094528,赢0,长度为0
10:29:16.396413 IP localhost.ndmp> localhost.56351:旗[R],SEQ 3931313021,赢0,长度为0
10:29:16.396419 IP localhost.56347> localhost.ndmp:标记[P.],seq 1:1001,ack 1,win 9186,选项[nop,nop,TS val 396158772 ecr 396158772],长度1000
10:29:16.396424 IP localhost.56351> localhost.ndmp:标志[P.],seq 1:1001,ack 1,win 9186,选项[nop,nop,TS val 396158772 ecr 396158772],长度1000
10:29:16.396429 IP localhost.ndmp> localhost.56349:Flags [。],ack 1,win 9186,options [nop,nop,TS val 396158772 ecr 396158772],长度0 10:29:16.396435 IP本地主机。 ndmp> localhost.56348:Flags [R],seq 2666080833,win 0,length 0
10:29:16.396441 IP localhost.nd mp> localhost.56350:Flags [。],ack 1,win 9186,options [nop,nop,TS val 396158772 ecr 396158772],长度0
10:29:16.396454 IP localhost.ndmp> localhost.56347:标志[R],SEQ 2871094528,赢0,长度为0
10:29:16.396460 IP localhost.ndmp> localhost.56351:旗[R],SEQ 3931313021,赢0,长度为0
来自unix网络编程,connect()
将启动3次握手例程,并返回服务器发送时syn & & ack。
从tcpdump
输出,最高10行告诉记者,服务器回复SYN & SCK虽然积压为2之后,客户端发送末次ACK和服务器返回RST。
在我看来,连接返回值!= -1意味着连接建立&客户端能够发送数据。但是上面的日志显示表明它不能以这种方式工作。
那么谁能告诉我哪个是正确?
在我的选择中,backlog表示队列的大小(包括服务器**回复ack **和连接**服务器接收syn **的连接)在上面的示例中,服务器一次获得5个连接,但队列为只有2,所以其余3应该是**忽略**或**获得ECONNREFUSED **,但它不是那样。 < – summer