⽹络编程socket之listen函数
摘要:listen函数使⽤主动连接套接⼝变为被连接套接⼝,使得⼀个进程可以接受其它进程的请求,从⽽成为⼀个服务器进程。在TCP服务器编程中listen函数把进程变为⼀个服务器,并指定相应的套接字变为被动连接。
listen函数在⼀般在调⽤bind之后-调⽤accept之前调⽤,它的函数原型是:
#include<sys/socket.h>
int listen(int sockfd, int backlog)
返回:0──成功, -1──失败
参数sockfd
被listen函数作⽤的套接字,sockfd之前由socket函数返回。在被socket函数返回的套接字fd之时,它是⼀个主动连接的套接字,也就是此时系统假设⽤户会对这个套接字调⽤connect函数,期待它主动与其它进程连接,然后在服务器编程中,⽤户希望这个套接字可以接受外来的连接请求,也就是被动等待⽤户来连接。由于系统默认时认为⼀个套接字是主动连接的,所以需要通过某种⽅式来告诉系统,⽤户进程通过系统调⽤listen来完成这件事。
参数backlog
这个参数涉及到⼀些⽹络的细节。在进程正理⼀个⼀个连接请求的时候,可能还存在其它的连接请求。因为TCP连接是⼀个过程,所以可能存在⼀种半连接的状态,有时由于同时尝试连接的⽤户过多,使得服务器进程⽆法快速地完成连接请求。如果这个情况出现了,服务器进程希望内核如何处理呢?内核会在⾃⼰的进程空间⾥维护⼀个队列以跟踪这些完成的连接但服务器进程还没有接⼿处理或正在进⾏的连接,这样的⼀个队列内核不可能让其任意⼤,所以必须有⼀个⼤⼩的上限。这个backlog告诉内核使⽤这个数值作为上限。
毫⽆疑问,服务器进程不能随便指定⼀个数值,内核有⼀个许可的范围。这个范围是实现相关的。很难有某种统⼀,⼀般这个值会⼩30以内。
当调⽤listen之后,服务器进程就可以调⽤accept来接受⼀个外来的请求。关于accept更的信息,请接着关注本系统⽂章。
recv函数
TCP的服务器端socket基本流程socket->bind->listen->accept->send/recv->closesocket,客户端基本流程socket->[bind->]->connect-
>send/recv->closesocket,其中客户端connect函数应该是和服务器端的listen函数相互作⽤,⽽不是acc
ept函数。在listen函数中的第⼆个参数backlog代表着等待处理的连接队列(以下简称队列)的长度,神马意思?我也不太懂,但是通过代码实践,我可以简单的说,每当有⼀个客户端connect了,listen的队列中就加⼊⼀个连接,每当服务器端accept了,就从listen的队列中取出⼀个连接,转成⼀个专门⽤来传输数据的socket(accept函数的返回值),所以在服务器端程序中有两个socket,前者是⽤来接收客户端连接的

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。