我最近一直在研究一些服务器-客户端代码,我发现了一个非常令人困惑的问题。我server
在端口上监听并设置backlog = 2,我的客户端创建 5 个线程到connect
.
在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:选择 Summer$ sudo tcpdump -ilo0 端口 10000
tcpdump:详细输出被抑制,使用 -v 或 -vv 进行完整的协议解码监听 lo0,链接类型 NULL(BSD 环回),捕获大小 65535 字节
10:29:16.396240 IP localhost.56347 > localhost.ndmp: 标志 [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: 标志 [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: Flags [S], seq 2161003109, win 65535, options [mss 16344,nop,wscale 4,nop,nop,TS val 396158772 ecr 0,sackOK,eol],长度 0
10:29:16.396246 IP localhost.56350 > localhost.ndmp: 标志 [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: 标志 [S.], seq 2871094527, ack 3366561900, win 65535, options [mss 16344,nop,wscale 4,nop,nop,TS val 396158772 ecr 396158872 ,eol],长度为 0
10:29:16.396307 IP localhost.ndmp > localhost.56351: 标志 [S.], seq 3931313020, ack 1956535576, win 65535, options [mss 16344,nop,wscale 4,nop,nop,TS val 396158772 ecr 396158872 ,eol],长度为 0
10:29:16.396332 IP localhost.ndmp > localhost.56349: 标志 [S.], seq 3467781056, ack 902832277, win 65535, options [mss 16344,nop,wscale 4,nop,nop,TS val 396158772 ecr 396158772, ,eol],长度为 0
10:29:16.396349 IP localhost.ndmp > localhost.56348: 标志 [S.], seq 2666080832, ack 2161003110, win 65535, options [mss 16344,nop,wscale 4,nop,nop,TS val 396158772 ecr 396158872 ,eol],长度为 0
10:29:16.396366 IP localhost.ndmp > localhost.56350: 标志 [S.], seq 2467582351, ack 1318035541, win 65535, options [mss 16344,nop,wscale 4,nop,nop,TS val 396158772 ecr 396158872 ,eol],长度为 0
10:29:16.396375 IP localhost.56347 > localhost.ndmp: 标志 [.], ack 1, win 9186, 选项 [nop,nop,TS val 396158772 ecr 396158772], 长度 0
10:29:16.396381 IP localhost.56351 > localhost.ndmp: 标志 [.], ack 1, win 9186, 选项 [nop,nop,TS val 396158772 ecr 396158772], 长度 0
10:29:16.396386 IP localhost.56349 > localhost.ndmp: 标志 [.], ack 1, win 9186, options [nop,nop,TS val 396158772 ecr 396158772], 长度 0
10:29:16.396391 IP localhost.56348 > localhost.ndmp: 标志 [.], ack 1, win 9186, 选项 [nop,nop,TS val 396158772 ecr 396158772], 长度 0
10:29:16.396398 IP localhost.56350 > localhost.ndmp: 标志 [.], 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, win 0, length 0
10:29:16.396413 IP localhost.ndmp > localhost.56351: 标志 [R], seq 3931313021, win 0, length 0
10:29:16.396419 IP localhost.56347 > localhost.ndmp: 标志 [P.], seq 1:1001, ack 1, win 9186, options [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, options [nop,nop,TS val 396158772 ecr 396158772], 长度 1000
10:29:16.396429 IP localhost.ndmp > localhost.56349: 标志 [.], ack 1, win 9186, options [nop,nop,TS val 396158772 ecr 396158772], 长度 0 10:29:16.396435 IP localhost.ndmp > localhost.56348:标志 [R],seq 2666080833,win 0,长度 0
10:29:16.396441 IP localhost.ndmp > localhost.56350:标志 [.],ack 1,win 9186,选项 [nop,nop,TS val 396158772 ecr 396158772],长度 0
10:29:16.396454 IP localhost.ndmp > localhost.56347: 标志 [R], seq 2871094528, win 0, length 0
10:29:16.396460 IP localhost.ndmp > localhost.56351: 标志 [R], seq 3931313021, win 0, length 0
从unix 网络编程,connect()
将启动3 次握手程序,并在服务器发送syn && ack时返回。
从tcpdump
输出中,前 10 行告诉服务器回复 syn & sck 虽然积压为 2。后来,客户端发送最后一次 ack和服务器返回 rst。
在我看来,连接返回值!= -1 表示连接已建立并且客户端能够发送数据。但是上面的日志显示它不是那样工作的。
那么谁能告诉我哪个是正确的?