socket编程之listen

来源:互联网 发布:长虹乐视网络电视报价 编辑:程序博客网 时间:2024/06/06 18:13

tcp        0      0 127.0.0.2:6000              0.0.0.0:*                   LISTEN      4462/./ser          tcp        0      0 127.0.0.2:6000              127.0.0.2:33797             SYN_RECV    -                   tcp        0      0 127.0.0.2:33796             127.0.0.2:6000              ESTABLISHED 4467/./cli          tcp        0      0 127.0.0.2:33797             127.0.0.2:6000              ESTABLISHED 4469/./cli          tcp        0      0 127.0.0.2:6000              127.0.0.2:33795             ESTABLISHED -                   tcp        0      0 127.0.0.2:6000              127.0.0.2:33796             ESTABLISHED -                   tcp        0      0 127.0.0.2:33795             127.0.0.2:6000              ESTABLISHED 4464/./cli

打开了三个客户端与服务器端建立连接,一个客户端发起之后会有两个条目产生,在开始前的两个client建立连接时,产生的服务器端和客户端段的状态都是estblisted,但是直到第三个时,客户端的状态端是estbllished,服务器端的是sys_recv状态。


猜测在listen时已经发了三次握手中的前两次,但是第三此客户端给服务器端发送的ack可能需要accept来接收才能建立完全的连接

在第三个报文的时候连接的状态


服务器虽然受到了客户端的sys报文也回复了sys报文使得客户端进入了estblished状态,但是服务器端仍然停留在sys_recv状态


如果将服务器端accept加入,如下

    listen(sockfd, 1);//宣告可以接受连接请求    while (1)    {        c = accept(sockfd, (struct sockaddr*)&caddr, &len);            cout<<"a connect estblished"<<endl;    }
那么客户端来多少服务器都能与之建立连接,打印出"a connect estblished"

所以,listen后的backlog就是在监听过程中建立前两次连接成功的队列数量,一旦accept成功接受,就会从该队列中拿走已经成功的,让出位置给后续的连接