listen()

#include <sys/types.h>          
#include <sys/socket.h>

#include <sys/types.h>         

 

#include <sys/socket.h>

int listen(int 威尼斯人6799.com,sockfd, int backlog);

 

 

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

描述:

 

listen()  marks  the  socket  referred  to  by sockfd as a passive
socket, that is, as a socket that will be used to accept incoming
connection requests using accept(2).

描述:

 

The  accept() system call is used with connection-based socket types
(SOCK_STREAM, SOCK_SEQPACKET).  It extracts the first connection
request on the queue of pending connections for the listening socket,
sockfd, creates  a  new  connected  socket,  and returns a new
file descriptor referring to that socket.  The newly created socket is
not in the listening state.  The original socket sockfd is
unaffected by this call.

The sockfd argument is a file descriptor that refers to a socket
of type SOCK_STREAM or SOCK_SEQPACKET.

 

 

The argument sockfd is a socket that has been created with
socket(2), bound to a local address with bind(2), and  is listening for
connections after a listen(2).

The backlog argument defines the maximum length to which the queue
of pending connections for sockfd may grow.  If a

 

connection  request  arrives  when the queue is full, the client may
receive an error with an indication of ECONNREFUSED or, if the
underlying protocol supports retransmission, the request may be ignored
so that a  later  reattempt at connection succeeds.

The  argument  addr  is a pointer to a sockaddr structure.  This
structure is filled in with the address of the peer socket, as known to
the communications layer.  The exact format of the address returned
addr is  determined  by  the socket’s address family (see
socket(2) and the respective protocol man pages).  When addr is
NULL, nothing is filled in; in this case, addrlen is not used, and
should also be NULL.

 

 

返回值:

返回值:

       On success, zero is returned.  On error, -1 is returned, and
errno is set appropriately.

On success, these system calls return a nonnegative integer that is a
descriptor for the accepted socket.  On error, -1 is returned, and errno
is set appropriately.

 

 

listen函数的首先个参数即为要监听的socket描述字,第贰个参数为对应socket能够排队的最艾哈迈达巴德接个数。socket()函数成立的socket暗中认可是八个积极性类型的,listen函数将socket变为被动类型的,等待客户的延续请求。

 

 

对于服务器编制程序中最首要的一步等待并收受客户的一而再,那么这一步在编制程序中怎么着形成,accept函数正是形成这一步的。它从水源中取出已经确立的客户连接,然后把那几个已经济建设立的总是重回给用户程序,此时用户程序就能够与和谐的客户拓展点到点的通讯了。

sockfd,被listen函数作用的套接字,sockfd此前由socket函数再次回到。在被socket函数再次回到的套接字fd之时,它是2个积极连接的套接字,也正是此时系统一旦用户会对这么些套接字调用connect函数,期待它主动与其他进度连接,然后在服务器编制程序中,用户期待这一个套接字能够承受外来的连年请求,也正是懊恼等待用户来连接。由于系统私下认可时以为3个套接字是主动连接的,所以供给通过某种方式来报告系统,用户进程经过系统调用listen来成功那件事。

 

 

accept暗中认可会阻塞进程,直到有3个客户连接建立后归来,它回到的是四个新可用的套接字,那一个套接字是连接套接字。此时大家须要区分三种套接字,一种套接字正如accept的参数sockfd,它是监听套接字,在调用listen函数之后,四个套接字会从积极连接的套接字变身为三个监听套接字;而accept重临是一个连接套接字,它意味着着3个网络已经存在的点点连接。自然要问的是:为啥要有二种套接字?原因很不难,假如运用二个讲述字的话,那么它的机能太多,使得应用很不直观,同时在根本确实产生了3个这么的新的叙说字。

backlog,其一参数涉及到有的互联网的细节。在进度正处理一个总是请求的时候,大概还设有别的的总是请求。因为TCP连接是多个进度,所以大概存在一种半三番五次的情景,有时是因为同时尝试连接的用户过多,使得服务器进度不能够急忙地完成连接请求。假诺那些情景出现了,服务器进程希望内核怎样处理啊?内核会在温馨的历程空间里爱惜3个队列以跟踪那个成就的总是但服务器进度还尚未接手处理或正在进展的连接,这样的三个行列内核不容许让其专断大,所以必须有叁个高低的上限。这么些backlog告诉内核使用这一个数值作为上限。

 

自然,服务器进程不可能随便钦命三个数值,内核有1个许可的限定。这几个限制是落到实处相关的。很难有某种统一,一般这几个值会小30以内。

sockfd,不畏地点表明中的监听套接字,这几个套接字用来监听一个端口,当有1个客户与服务器连接时,它应用那几个2个端口号,而此时这么些端口号正与那些套接字关联。当然客户不知底套接字那一个细节,它只略知一二1个地点和2个端口号。

 

 

addr
那是二个结出参数,它用来经受三个重临值,那重回值钦定客户端的地方,当然这些地址是通过有些地方结构来描述的,用户应该清楚那三个哪些的地点结构。假设对客户的地方不感兴趣,那么可以把那一个值设置为NULL。

 

addrlen,就像我们所认为的,它也是结果的参数,用来经受上述addr的组织的轻重缓急的,它指明addr结构所占有的字节个数。同样的,它也得以棉被服装置为NULL。

 

一旦accept成功再次来到,则服务器与客户已经正确树立连接了,此时服务器通过accept重返的套接字来形成与客户的通讯。