精华内容
下载资源
问答
  • listen函数

    万次阅读 2017-08-19 20:54:04
    listen函数,从英语上理解就是一个"听"函数,实际上它也就是这个意思。我们来看unix网络编程这本书是怎样对它的解释:listen函数把一个未连接的套接字转换成一个被动套接字,指示内核应该接受指向该套接字的链接请求...

              listen函数,从英语上理解就是一个"听"函数,实际上它也就是这个意思。我们来看unix网络编程这本书是怎样对它的解释:listen函数把一个未连接的套接字转换成一个被动套接字,指示内核应该接受指向该套接字的链接请求。该函数有2个参数,第一个我就不说了,第二参数规定了内核为相应套接字排队的最大连接个数。只看这些理论搞的人稀里糊涂,我们还是来测一下。

     

    [mapan@localhost test]$ ls
    client.cpp  makefile  server.cpp
    [mapan@localhost test]$ 
    [mapan@localhost test]$ cat server.cpp 
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <errno.h>
    #include <malloc.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/ioctl.h>
    #include <stdarg.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <signal.h>
    #define MAXLINE 4096
    
    
    
    void main()
    {
       int listenfd,connfd;
       socklen_t  clilen;
       struct sockaddr_in cliaddr,servaddr;
    
       listenfd=socket(AF_INET,SOCK_STREAM,0);
       bzero(&servaddr,sizeof(servaddr));
    
       servaddr.sin_family=AF_INET;
       servaddr.sin_addr.s_addr=INADDR_ANY;
       servaddr.sin_port=htons(8888);
    
       bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));  
       listen(listenfd,1);
    
       getchar();
       connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);
    
    
    
       close(connfd);
       close(listenfd);
    }
    [mapan@localhost test]$ cat client.cpp 
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <errno.h>
    #include <malloc.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/ioctl.h>
    #include <stdarg.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <signal.h>
    #define MAXLINE 4096
    
    
    void main()
    {
       int sockfd;
       struct sockaddr_in servaddr;
    
    
       sockfd=socket(AF_INET,SOCK_STREAM,0);
       bzero(&servaddr,sizeof(servaddr));
       servaddr.sin_family=AF_INET;
       servaddr.sin_port=htons(8888);
       servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    
       int ret=connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
       getchar();
    
       close(sockfd);
    }
    [mapan@localhost test]$ cat makefile 
    all:server client
    
    server.o:server.cpp
    	g++ -c server.cpp
    client.o:client.cpp
    	g++ -c client.cpp
    server:server.o
    	g++ -o server server.o
    client:client.o
    	g++ -o client client.o
    
    clean:
    	rm -f server client *.o
    [mapan@localhost test]$ 
    

     

     

    请注意上面的服务端中,我是没有调用accept函数的,直接调用getchar()了,跑起来。

     

    [mapan@localhost test]$ make
    g++ -c server.cpp
    g++ -o server server.o
    g++ -c client.cpp
    g++ -o client client.o
    [mapan@localhost test]$ ./server 
    

    服务度开启,然后新打开一个窗口开启客户端。

    [mapan@localhost TCP]$ cd ../test/
    [mapan@localhost test]$ 
    [mapan@localhost test]$ ./client 127.0.0.1
    

     

    查看网络:

    [mapan@localhost test]$ netstat -na | grep 8888
    tcp        0      0 0.0.0.0:8888                0.0.0.0:*                   LISTEN      
    tcp        0      0 127.0.0.1:34846             127.0.0.1:8888              ESTABLISHED 
    tcp        0      0 127.0.0.1:8888              127.0.0.1:34846             ESTABLISHED 
    [mapan@localhost test]$ 
    

    看,已经建立起一个连接了。但是我们没有调用accept函数,连接还是建立起来了,这说说明accept函数和TCP三次握手没啥关系,这也是一个知识盲点。好,在开启一个新窗口运行客户端,查看网络状态。(新开窗口运行客户端同上,这里就不用代码演示了)

     

     

    [mapan@localhost test]$ netstat -na | grep 8888
    tcp        0      0 0.0.0.0:8888                0.0.0.0:*                   LISTEN      
    tcp        0      0 127.0.0.1:34846             127.0.0.1:8888              ESTABLISHED 
    tcp        0      0 127.0.0.1:34848             127.0.0.1:8888              ESTABLISHED 
    tcp        0      0 127.0.0.1:8888              127.0.0.1:34846             ESTABLISHED 
    tcp        0      0 127.0.0.1:8888              127.0.0.1:34848             ESTABLISHED 


    看,又建立起一个连接。在运行一个客户端,看网络状态。

     

    [mapan@localhost test]$ netstat -na | grep 8888
    tcp        0      0 0.0.0.0:8888                0.0.0.0:*                   LISTEN      
    tcp        0      0 127.0.0.1:8888              127.0.0.1:34850             SYN_RECV    
    tcp        0      0 127.0.0.1:34846             127.0.0.1:8888              ESTABLISHED 
    tcp        0      0 127.0.0.1:34848             127.0.0.1:8888              ESTABLISHED 
    tcp        0      0 127.0.0.1:8888              127.0.0.1:34846             ESTABLISHED 
    tcp        0      0 127.0.0.1:8888              127.0.0.1:34848             ESTABLISHED 
    tcp        0      0 127.0.0.1:34850             127.0.0.1:8888              ESTABLISHED


    当第三个客户端连接进来的时候,出现了一个SYN_RECV,这标明第三个客户端没有与服务端建立连接。我们listen函数设置的监听队列为1,那么监听队列塞了2个之后就没有往里面塞了。这下大概懂了listen函数第二个参数的意义了吧,当参数为1的时候只能监听2个套接字,这应该是从0开始数的。为什么是大概呢?其实unix网络编程上是这样说的:listen函数的第二个参数是ESTABLISHED和SYN_RECV之和,只是在监听队列没有满的情况下,SYN_RECV状态不容易重现。这时候在服务度输入一个字符会有啥效果呢?答案告诉你,就是那个SYN_RECV状态变成ESTABLISHED了,这也是 accept函数的作用。accept函数会将已完成连接队列中的对头项返回给进程,所以SYN_RECV变成ESTABLISHED了。这个现象留给大家去实践一下吧,只有自己实践出来的东西才是自己的。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • listen函数详解

    千次阅读 2019-02-23 09:12:42
    listen函数详解

    分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

                   

            套接字与“地方”绑定好了后,对于服务端而言(这里是TCP情况),自然就应该乖乖地去聆听,聆听客户端的需求,否则怎么会叫服务客户呢?如何去聆听呢?很简单,这个单词你早就学过了,那就是listen, 我们来看看listen函数的原型: 

    int PASCAL FAR listen (SOCKET s, int backlog);

           第一个参数是服务端套接字,你要聆听,总得出来说个话啊,好,就指定你了;第二个参数是等待连接队列的最大长度,比方说,你将backlog定为10, 当有15个连接请求的时候,前面10个连接请求就被放置在请求队列中,后面5个请求被拒绝。千千万万要注意:这个10并不是表示客户端最大的连接数为10, 实际上可以有很多很多的客户端(实践证明也是如此)。

          再看函数的返回值,成功返回0, 失败返回-1.

               

    分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • listen函数介绍

    2020-07-31 09:37:14
    文章目录1 listen函数介绍 1 listen函数介绍 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int listen(int sockfd, int backlog); /* sockfd: socket文件描述符 backlog: 在...

    1 listen函数介绍

    #include <sys/types.h> /* See NOTES */
    #include <sys/socket.h>
    int listen(int sockfd, int backlog);
    
    /*
    sockfd:
    	socket文件描述符
    backlog:
    	在Linux 系统中,它是指排队等待建立3次握手队列长度
    */
    

    查看系统默认backlog:
    cat /proc/sys/net/ipv4/tcp_max_syn_backlog

    改变系统限制的backlog 大小:
    vim /etc/sysctl.conf

    最后添加:
    net.core.somaxconn = 1024 net.ipv4.tcp_max_syn_backlog = 1024

    保存,然后执行:
    sysctl -p

    典型的服务器程序可以同时服务于多个客户端,当有客户端发起连接时,服务器调用的accept()返回并接受这个连接,如果有大量的客户端发起连接而服务器来不及处理,尚未accept的客户端就处于连接等待状态,listen()声明sockfd处于监听状态,并且最多允许有backlog个客户端处于连接待状态,如果接收到更多的连接请求就忽略。listen()成功返回0,失败返回-1。


    参考资料:

    1. C/C++从入门到精通-高级程序员之路【奇牛学院】
    展开全文
  • listen函数和accept函数

    2017-02-20 01:42:47
    listen函数原型: #include int listen(int sockfd,int backlog); 参考《Linux高性能服务器编程》上的解释: socket 被命名之后,还不能马上接受客户连接,需要系统调listen用来创建一个监听队列用来存放待...



    listen函数原型:

    #include<sys/socket.h>



    int listen(int sockfd,int backlog);


    参考《Linux高性能服务器编程》上的解释: socket 被命名之后,还不能马上接受客户连接,需要系统调listen用来创建一个监听队列用来存放待处理的客户连接。对于各个参数:sockfd指定被监听的socket,backlog提示内核监听队列的最大长度。

    成功时返回0,失败返回-1并设置errno。

     我对这个函数理解是创建一个监听队列,使需要主动连接的sockfd变成被动接受连接状态。当调用了这个函数的时候,socket变成监听套接字,从一个进程变成一个服务器来响应请求。



    当套接字正在处理客户端的请求时,有新的请求也处理不了。那么会怎么办呢?


    请求队列


    参考TCP/IP详解 卷一:

    如果对于新的连接请求,该 T C P监听的端点的连接队列中还有空间T C P模块将对S Y N进行确认并完成连接的建立。但应用层只有在三次握手中的第三个报文段收到后才会知道这个新连接时。另外,当客户进程的主动打开成功但服务器的应用层还不知道这个新的连接时,它可能会认为服务器进程已经准备好接收数据了(如果发生这种情况,服务器的T C P仅将接收的数据放入缓冲队列)

    如果队列满了呢?

    如果对于新的连接请求,连接队列中已没有空间, TCP将不理会收到的SYN也不发回任何报文段(即不发回RST)。如果应用层不能及时接受已被TCP接受的连接,这些连接可能占满整个连接队列,客户的主动打开最终将超时


    通常队列满是由于应用程序或者操作系统繁忙造成的,这样可以防止应用程序对传入的连接进行服务。



    backlog的值设置为SOMAXCONN就会由系统来决定请求队列长度(一般较大)。


    需要注意的是这里的backlog和系统允许的最大连接数或者并发服务器所能并发处理的客户数没什么关系。因为backlog说明的是已经完成三次握手后在等待应用层接受的最大连接数。


    此时socket处于监听状态。但是要接收请求则需accept函数。



    accept函数原型:

    #include<sys/socket.h>

    int accept(int sockfd,struct sockaddr * addr,socklen_t * addrlen);


    作用:从listen监听队列中接受一个连接。

    sockfd是经过listen调用的监听socket,addr用来获取被接受连接的远端socket地址,该地址长度由addrlen指出。该socket唯一的标识了这个被接受的连接,服务器可通过读写该socket来跟对应的客户端通信。成功返回一个新的连接socket,失败则返回-1并设置errno。




    展开全文
  • linux listen函数详解

    2020-02-03 18:58:27
    listen()函数用于服务器,使已绑定的socket等待监听客户端的连接请求,并设置服务器同时可连接的数量,listen函数位于sys/socket.h头文件中; sockfd为socket文件描述符; backlog用于设置请求队列最大长度; listen...
  • TCP服务器listen函数的包裹函数

    千次阅读 2015-09-25 11:33:54
    TCP服务器listen函数的包裹函数前言:本文将介绍listen函数的包裹函数。listen()函数#include int listen(int sockfd,int backlog)//成功返回0,失败返回-1当TCP服务器调用listen函数时,它做两件事: 把服务器套接...
  • socket通信之listen函数的作用函数原型和参数说明listen函数的作用一、函数原型和参数说明二、listen函数的作用 函数原型和参数说明 listen函数的作用 一、函数原型和参数说明 listen函数原型 #include<sys/...
  • UNIX网络编程-listen函数及其包裹函数介绍函数简介#include<sys/socket.h>int listen(int sockfd,int backlog); 返回:若成功则为0,若出错则为-1目前listen函数仅为TCP服务器调用,主要完成两个任务: 1. 将...
  • 网络编程之listen函数

    千次阅读 2018-04-11 13:07:09
    基本TCP客户端/服务器程序的套接字函数listen函数仅由TCP服务调用,它做两件事 1.当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,它是一个将调用connect连接的客户套接字。listen函数把一个未...
  • linux下listen函数

    万次阅读 2014-03-05 22:53:16
    listen函数在一般在调用bind之后-调用accept之前调用,它的函数原型是: #include int listen(int sockfd, int backlog)   参数sockfd是被listen函数作用的套接字 参数backlog是侦听队列的长度。在进程...
  • 网络编程socket之listen函数

    千次阅读 2018-05-23 15:17:39
    网络编程socket之listen函数 摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应...
  • linux网络编程之Listen函数参数介绍

    千次阅读 2017-03-15 15:23:06
    listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。 listen函数在...
  • listen函数.

    千次阅读 2010-06-13 18:23:00
    摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。listen...
  • QTcpServer的listen函数

    千次阅读 2017-02-04 18:43:42
    listen函数会对指定的地址和端口进行绑定,该绑定模式应该是ShareAddress(经测试在用其他套接字进行相同的绑定不会失败)
  • linux socket listen函数

    千次阅读 2014-02-11 10:32:20
    摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。 ...
  • 4.4 bind函数 bind函数把一个本地协议地址赋予给一个套接字。 #include int bind(int sockfd, ...listen函数仅有TCP服务器调用,它做了两件事。 (1)当socket函数创建一个套接字时,它被假设为一个主动套接字,
  • 套接字api之listen函数

    2020-05-24 17:35:21
    listen函数仅由服务器端调用,主要干了两个事情: 将套接字从closed转态转为listen状态; 函数的第二个参数backlog指定了内核为相应套接字排队的最大连接个数。 #include <sys/socket.h> int listen(int ...
  • listen函数 摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动...
  • socket通信之listen函数

    万次阅读 2020-11-17 10:19:35
    socket通信之listen函数 listen函数原型如下: #include <sys/types.h> #include <sys/socket.h> int listen(int sockfd, int backlog); 第一个参数sockfd为创建socket返回的文件描述符。 第二个参数...
  • 要想知道客户端想要连接就得调用listen函数 函数原型 #include &amp;lt;sys/socket.h&amp;gt; int listen(int sockfd, int backlog); 成功 : 返回0; 失败 : 返回-1. 函数语义 假设由socket函...
  • 请教: listen函数方法实现,函数体是什么 我抄了一段代码为什么执行到listen函数这儿就不往下执行了也不报错
  • listen函数与TCP连接建立过程的关系 TCP服务端程序创建过程:建立监听socket,通过bind绑定到服务地址和端口后,调用listen开始监听服务端口。这时在操作系统内核会建立SYN队列(未完成握手队列)和ACCEPT队列(已...
  • listen函数的深入理解1.作用 listen函数的作用是把一个未连接的套接字转换为被动套接字,指示内核应该接受指向该套接字的连接请求。使套接字从CLOSED状态转换到LISTEN状态。2.函数原型及解析 #include&lt;sys/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 134,588
精华内容 53,835
关键字:

listen函数