摘要:listen函数使⽤主动连接套接⼝变为被连接套接⼝,使得⼀个进程可以接受其它进程的请求,从⽽成为⼀个服务器进程。在TCP服务器编程中listen函数把进程变为⼀个服务器,并指定相应的套接字变为被动连接。listen函数在⼀般在调⽤bind之后-调⽤accept之前调⽤,它的函数原型是:#include int listen(int sockfd, int backlog)返回:0──成功, -1──失败 参数sockfd 被listen函数作⽤的套接字,sockfd之前由socket函数返回。在被socket函数返回的套接字fd之时,它是⼀个主动连接的套接字,也就是此时系统假设⽤户会对这个套接字调⽤connect函数,期待它主动与其它进程连接,然后在服务器编程中,⽤户希望这个套接字可以接受外来的连接请求,也就是被动等待⽤户来连接。由于系统默认时认为⼀个套接字是主动连接的,所以需要通过某种⽅式来告诉系统,⽤户进程通过系统调⽤listen来完成这件事。参数backlog 这个参数涉及到⼀些⽹络的细节。在进程正理⼀个⼀个连接请求的时候,可能还存在其它的连接请求。因为TCP连接是⼀个过程,所以可能存在⼀种半连接的状态,有时由于同时尝试连接的⽤户过多,使得服务器进程⽆法快速地完成连接请求。如果这个情况出现了,服务器进程希望内核如何处理呢?内核会在⾃⼰的进程空间⾥维护⼀个队列以跟踪这些完成的连接但服务器进程还没有接⼿处理或正在进⾏的连接,这样的⼀个队列内核不可能让其任意⼤,所以必须有⼀个⼤⼩的上限。这个backlog告诉内核使⽤这个数值作为上限。 毫⽆疑问,服务器进程不能随便指定⼀个数值,内核有⼀个许可的范围。这个范围是实现相关的。很难有某种统⼀,⼀般这个值会⼩30以内。 当调⽤listen之后,服务器进程就可以调⽤accept来接受⼀个外来的请求。关于accept更的信息,请接着关注本系统⽂章。 下⾯是来⾃于(http://blog.csdn.net/forrest_chen/article/details/7021409)的⼀段话: TCP的服务器端socket基本流程socket->bind->listen->accept->send/recv->closesocket,客户端基本流程socket->[bind->]->connect->send/recv->closesocket,其中客户端connect函数应该是和服务器端的listen函数相互作⽤,⽽不是accept函数。在listen函数中的第⼆个参数backlog代表着等待处理的连接队列(以下简称队列)的长度,神马意思?我也不太懂,但是通过代码实践,我可以简单的说,每当有⼀个客户端connect了,listen的队列中就加⼊⼀个连接,每当服务器端accept了,就从listen的队列中取出⼀个连接,转成⼀个专门⽤来传输数据的socket(accept函数的返回值),所以在服务器端程序中有两个socket,前者是⽤来接收客户端连接的socket... 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- niushuan.com 版权所有 赣ICP备2024042780号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务