C语言 socket listen()函数(socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求)

Posted Dontla

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 socket listen()函数(socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求)相关的知识,希望对你有一定的参考价值。

摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。

listen函数一般在调用bind之后-调用accept之前调用,它的函数原型是:

#include <sys/types.h>
#include <sys/socket.h>
int listen(int sockfd, int backlog)
  • 返回:0──成功, -1──失败

  • 参数sockfd(创建socket返回的文件描述符)
    被listen函数作用的套接字,sockfd由之前的socket函数返回。在被socket函数返回的套接字fd之时,它是一个主动连接的套接字,也就是此时系统假设用户会对这个套接字调用connect函数,期待它主动与其它进程连接,然后在服务器编程中,用户希望这个套接字可以接受外来的连接请求,也就是被动等待用户来连接。由于系统默认时认为一个套接字是主动连接的,所以需要通过某种方式来告诉系统,用户进程通过系统调用listen来完成这件事。

  • 参数backlog(建立好连接处于ESTABLISHED状态的队列的长度,backlog的最大值128)
    这个参数涉及到一些网络的细节。在进程正理一个一个连接请求的时候,可能还存在其它的连接请求。因为TCP连接是一个过程,所以可能存在一种半连接的状态,有时由于同时尝试连接的用户过多,使得服务器进程无法快速地完成连接请求。如果这个情况出现了,服务器进程希望内核如何处理呢?内核会在自己的进程空间里维护一个队列以跟踪这些完成的连接但服务器进程还没有接手处理或正在进行的连接,这样的一个队列内核不可能让其任意大,所以必须有一个大小的上限。这个backlog告诉内核使用这个数值作为上限。
    毫无疑问,服务器进程不能随便指定一个数值,内核有一个许可的范围。这个范围是实现相关的。很难有某种统一,一般这个值会在30以内。

当调用listen之后,服务器进程就可以调用accept来接受一个外来的请求。

参考文章1:网络编程socket之listen函数

参考文章2:socket通信之listen函数

以上是关于C语言 socket listen()函数(socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求)的主要内容,如果未能解决你的问题,请参考以下文章

websocket 函数

socket套接字

基于socket套接字low版ftp

Django入门篇

Go语言 之Socket简单C/S模型通信

套接字接上链接循环