精华内容
下载资源
问答
  • 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。




    展开全文
  • 对于服务器端程序,使用 bind() 绑定套接字后,还需要使用 listen() 函数让套接字进入被动监听状态,再调用 accept() 函数,就可以随时响应客户端的请求了。 listen() 函数 通过 listen() 函数可以让套接字进入...
    对于服务器端程序,使用 bind() 绑定套接字后,还需要使用 listen() 函数让套接字进入被动监听状态,再调用 accept() 函数,就可以随时响应客户端的请求了。
    

    listen() 函数

    通过 listen() 函数可以让套接字进入被动监听状态,它的原型为:
    1. int listen(int sock, int backlog); //Linux
    2. int listen(SOCKET sock, int backlog); //Windows
    sock 为需要进入监听状态的套接字,backlog 为请求队列的最大长度。

    所谓被动监听,是指当没有客户端请求时,套接字处于“睡眠”状态,只有当接收到客户端请求时,套接字才会被“唤醒”来响应请求。

    请求队列

    当套接字正在处理客户端请求时,如果有新的请求进来,套接字是没法处理的,只能把它放进缓冲区,待当前请求处理完毕后,再从缓冲区中读取出来处理。如果不断有新的请求进来,它们就按照先后顺序在缓冲区中排队,直到缓冲区满。这个缓冲区,就称为请求队列(Request Queue)

    缓冲区的长度(能存放多少个客户端请求)可以通过 listen() 函数的 backlog 参数指定,但究竟为多少并没有什么标准,可以根据你的需求来定,并发量小的话可以是10或者20。

    如果将 backlog 的值设置为 SOMAXCONN,就由系统来决定请求队列长度,这个值一般比较大,可能是几百,或者更多。

    当请求队列满时,就不再接收新的请求,对于 Linux,客户端会收到 ECONNREFUSED 错误,对于 Windows,客户端会收到 WSAECONNREFUSED 错误。

    注意:listen() 只是让套接字处于监听状态,并没有接收请求。接收请求需要使用 accept() 函数。

    accept() 函数

    当套接字处于监听状态时,可以通过 accept() 函数来接收客户端请求。它的原型为:
    1. int accept(int sock, struct sockaddr *addr, socklen_t *addrlen); //Linux
    2. SOCKET accept(SOCKET sock, struct sockaddr *addr, int *addrlen); //Windows
    它的参数与 listen() 和 connect() 是相同的:sock 为服务器端套接字,addr 为 sockaddr_in 结构体变量,addrlen 为参数 addr 的长度,可由 sizeof() 求得。

    accept() 返回一个新的套接字来和客户端通信,addr 保存了客户端的IP地址和端口号,而 sock 是服务器端的套接字,大家注意区分。后面和客户端通信时,要使用这个新生成的套接字,而不是原来服务器端的套接字。

    最后需要说明的是:listen() 只是让套接字进入监听状态,并没有真正接收客户端请求,listen() 后面的代码会继续执行,直到遇到 accept()。accept() 会阻塞程序执行(后面代码不能被执行),直到有新的请求到来。
    展开全文
  • 对于服务器端程序,使用 bind() 绑定套接字后,还需要使用 listen() 函数让套接字进入被动监听状态,再调用 accept() 函数,就可以随时响应客户端的请求了。 listen() 函数 通过 listen() 函数可以让套接字进入...
    对于服务器端程序,使用 bind() 绑定套接字后,还需要使用 listen() 函数让套接字进入被动监听状态,再调用 accept() 函数,就可以随时响应客户端的请求了。
    

    listen() 函数

    通过 listen() 函数可以让套接字进入被动监听状态,它的原型为:
    1. int listen(int sock, int backlog); //Linux
    2. int listen(SOCKET sock, int backlog); //Windows
    sock 为需要进入监听状态的套接字,backlog 为请求队列的最大长度。

    所谓被动监听,是指当没有客户端请求时,套接字处于“睡眠”状态,只有当接收到客户端请求时,套接字才会被“唤醒”来响应请求。

    请求队列

    当套接字正在处理客户端请求时,如果有新的请求进来,套接字是没法处理的,只能把它放进缓冲区,待当前请求处理完毕后,再从缓冲区中读取出来处理。如果不断有新的请求进来,它们就按照先后顺序在缓冲区中排队,直到缓冲区满。这个缓冲区,就称为请求队列(Request Queue)

    缓冲区的长度(能存放多少个客户端请求)可以通过 listen() 函数的 backlog 参数指定,但究竟为多少并没有什么标准,可以根据你的需求来定,并发量小的话可以是10或者20。

    如果将 backlog 的值设置为 SOMAXCONN,就由系统来决定请求队列长度,这个值一般比较大,可能是几百,或者更多。

    当请求队列满时,就不再接收新的请求,对于 Linux,客户端会收到 ECONNREFUSED 错误,对于 Windows,客户端会收到 WSAECONNREFUSED 错误。

    注意:listen() 只是让套接字处于监听状态,并没有接收请求。接收请求需要使用 accept() 函数。

    accept() 函数

    当套接字处于监听状态时,可以通过 accept() 函数来接收客户端请求。它的原型为:
    1. int accept(int sock, struct sockaddr *addr, socklen_t *addrlen); //Linux
    2. SOCKET accept(SOCKET sock, struct sockaddr *addr, int *addrlen); //Windows
    它的参数与 listen() 和 connect() 是相同的:sock 为服务器端套接字,addr 为 sockaddr_in 结构体变量,addrlen 为参数 addr 的长度,可由 sizeof() 求得。

    accept() 返回一个新的套接字来和客户端通信,addr 保存了客户端的IP地址和端口号,而 sock 是服务器端的套接字,大家注意区分。后面和客户端通信时,要使用这个新生成的套接字,而不是原来服务器端的套接字。

    最后需要说明的是:listen() 只是让套接字进入监听状态,并没有真正接收客户端请求,listen() 后面的代码会继续执行,直到遇到 accept()。accept() 会阻塞程序执行(后面代码不能被执行),直到有新的请求到来。
    展开全文
  • 对于服务器端程序,使用 bind() 绑定套接字后,还需要使用 listen() 函数让套接字进入被动监听状态,再调用 accept() 函数,就可以随时响应客户端的请求了。 listen() 函数 通过 listen() 函数可以让套接字...

      声明:本博客所转《socket编程》系列教程来自C语言中文网,本文地址使用listen()和accept()函数,本文仅供学习交流,更多内容请支持原创!


    对于服务器端程序,使用 bind() 绑定套接字后,还需要使用 listen() 函数让套接字进入被动监听状态,再调用 accept() 函数,就可以随时响应客户端的请求了。

    listen() 函数

    通过 listen() 函数可以让套接字进入被动监听状态,它的原型为:

    int listen(int sock, int backlog);  //Linux
    int listen(SOCKET sock, int backlog);  //Windows
    

    sock 为需要进入监听状态的套接字,backlog 为请求队列的最大长度。

    所谓被动监听,是指当没有客户端请求时,套接字处于“睡眠”状态,只有当接收到客户端请求时,套接字才会被“唤醒”来响应请求。
    请求队列
    当套接字正在处理客户端请求时,如果有新的请求进来,套接字是没法处理的,只能把它放进缓冲区,待当前请求处理完毕后,再从缓冲区中读取出来处理。如果不断有新的请求进来,它们就按照先后顺序在缓冲区中排队,直到缓冲区满。这个缓冲区,就称为请求队列(Request Queue)

    缓冲区的长度(能存放多少个客户端请求)可以通过 listen() 函数的 backlog 参数指定,但究竟为多少并没有什么标准,可以根据你的需求来定,并发量小的话可以是10或者20。

    如果将 backlog 的值设置为 SOMAXCONN,就由系统来决定请求队列长度,这个值一般比较大,可能是几百,或者更多。

    当请求队列满时,就不再接收新的请求,对于 Linux,客户端会收到 ECONNREFUSED 错误,对于 Windows,客户端会收到 WSAECONNREFUSED 错误。

    注意:listen() 只是让套接字处于监听状态,并没有接收请求。接收请求需要使用 accept() 函数。

    accept() 函数

    当套接字处于监听状态时,可以通过 accept() 函数来接收客户端请求。它的原型为:

    int accept(int sock, struct sockaddr *addr, socklen_t *addrlen);  //Linux
    SOCKET accept(SOCKET sock, struct sockaddr *addr, int *addrlen);  //Windows
    

    它的参数与 listen() 和 connect() 是相同的:sock 为服务器端套接字,addr 为 sockaddr_in 结构体变量,addrlen 为参数 addr 的长度,可由 sizeof() 求得。

    accept() 返回一个新的套接字来和客户端通信,addr 保存了客户端的IP地址和端口号,而 sock 是服务器端的套接字,大家注意区分。后面和客户端通信时,要使用这个新生成的套接字,而不是原来服务器端的套接字。

    最后需要说明的是:listen() 只是让套接字进入监听状态,并没有真正接收客户端请求,listen() 后面的代码会继续执行,直到遇到 accept()。accept() 会阻塞程序执行(后面代码不能被执行),直到有新的请求到来。

    展开全文
  • 对于服务器端程序,使用 bind() 绑定套接字后,还需要使用 listen() 函数让套接字进入被动监听状态,再调用 accept() 函数,就可以随时响应客户端的请求了。 listen() 函数 通过 listen() 函数可以让套接字进入...
  • //这里的service会作为输出型参数,因为服务器端是任意Ip主机都保持连接状态,这里接收服务的参数,然后打印出来 char buf_service[ 1024 ]={ 0 }; read_size=read(fd,buf_service, sizeof (buf_service)- 1 );...
  • 对于服务器端程序,使用 bind() 绑定套接字后,还需要使用 listen() 函数让套接字进入被动监听状态,再调用 accept() 函数,就可以随时响应客户端的请求了。 listen() 函数 通过 listen() 函数可以让套接字进入...
  • 服务器端,socket()返回的套接字用于监听(listen接受(accept)客户端的连接请求。这个套接字不能用于与客户端之间发送接收数据。   accept()接受一个客户端的连接请求,并返回一个新的套接字。所谓“新的...
  • 对于服务器端程序,使用 bind() 绑定套接字后,还需要使用 listen() 函数让套接字进入被动监听状态,再调用 accept() 函数,就可以随时响应客户端的请求了。 listen() 函数 通过 listen() 函数可以让套接字进入...
  • 1、服务器端程序: 1创建一个socket,用函数socket() 2绑定IP地址、端口等信息到socket上,用函数bind() 3设置允许的最大连接数,用函数listen() 4接收客户端上来的连接,用函数accept() 5收发数据,用函数send...
  • 面向连接的网络应用程序分为客户端和服务器端服务器端的执行流程一般为4步,客户端程序相对简单,一般需要两个步骤。 服务器端执行流程4步如下: (1)调用socket函数,建立一个套接字,该套接字用于接下来的...
  • socket系统调用listen只被tcp 服务器使用,他做两件事: 1. 将未链接的套接口转换为被动套接口,指示内核接受向此套接口的连接请求,调用此系统调用后tcp 状态机有close转换到listen. 2.第二个参数制定了内核为此...
  • 1、服务器端程序: 1创建一个socket,用函数socket() 2绑定IP地址、端口等信息到socket上,用函数bind() 3设置允许的最大连接数,用函数listen() 4接收客户端上来的连接,用函数accept() 5收发数据,用函数send()...
  • accept()函数

    2012-06-28 15:33:44
    TCP服务器端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址了。TCP客户端依次调用socket()、connect()之后就想TCP服务器发送了一个连接请求。TCP服务器监听到这个请求之后,就会调用accept()...
  •  建立连接时,服务器端绑定端口监听(bind&listen),客户端发送连接请求(connect),然后服务器端接受请求accept,至此客户端和服务器端可以收发消息。  需要注意:  1)创建socket前需要调用WSAStartu
  • 为什么服务器端只需要一个:服务器端口 客户端需要:服务器端口 + 服务器IP 因为服务器是时时在监听(Listen)有没有客户端的连接。如果服务器不绑定IP端口的话(Bind),客户端上线的时候怎么连到服务器呢...
  • 基本TCP客户端/服务器程序的套接字函数accept函数由TCP服务器调用,用于从已完成连接队列队头返回下一个已完成连接(从这不难看出accept是在三次握手之后,文章最后具体说明,已完成连接队列请转连接自行观看)。...
  • 网络编程socket之listen函数

    万次阅读 2015-05-19 14:01:39
    摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程...listen函数在一般在调用bind之后-调用accept之前调用,它的函数原型是: #include int listen(int sockfd, int backlog)
  • listen函数中backlog的含义

    千次阅读 2013-10-10 22:09:24
    TCP中服务器端调用listen函数监听客户端的连接,listen函数的第二个参数backlog到底是什么意思呢? 可以这样理解: 服务器端TCP内核模块维护有2个队列,我们称之为A,B吧。 客户端向服务器端connect的时候,...
  • LwIP tcp/ip socket编程listen函数分析

    千次阅读 2015-02-09 17:28:22
    下面只讨论TCP UDP不做讨论(很少使用到listen函数) 用法:函数应该在调用socketbind这两个函数之后,accept函数之前调用。 作用:让服务器套接字sockfd进于监听状态。 参数:  sockfd:套接字,成功...
  • 1、服务器端程序: 1创建一个socket,用函数socket() 2绑定IP地址、端口等信息到socket上,用函数bind() 3设置允许的最大连接数,用函数listen() 4接收客户端上来的连接,用函数accept() 5收发数据,用函数send...
  • linux 服务器端listen(5)

    千次阅读 2018-07-01 17:05:42
    listen函数在一般在调用bind之后-调用accept之前调用,它的函数原型是: #include int listen(int sockfd, int backlog) 参数sockfd是被listen函数作用的套接字, 参数backlog是侦听队列的长度。 在进程正在处理一个...
  • 如果你熟悉linux网络编程,那么对...就是一个可以用来接收连接,可以在其上调用accept调用的一个socket。调用listen会使socket从CLOSE状态转移到LISTEN状态。因为socket默认创建的是一个主动的socket,所以要作为服务器

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,059
精华内容 16,423
关键字:

服务器端accept和listen函数