首页 > C语言网络编程:listen函数详解

C语言网络编程:listen函数详解

文章目录

          • 前言
          • 函数描述
          • 代码实例
          • TCP服务器为什么调用listen

前言

根据TCP编程模型中我们可以看到之前的socketbind接口是tcp服务器在为接收客户端的链接做准备,保证tcp的面向字节流,面向连接的可靠通信服务正常进行。接下来的listen端口则为我们进行三次握手与客户端进行链接的接口。

TCP编程模型如下

在这里插入图片描述


函数描述
  • #include
  • int listen(int sockfd, int backlog);
  • 函数功能:将套接字文件描述符从主动转为被动文件描述符,然后用于被动监听客户端的连接
  • 函数返回值:成功返回0,失败返回-1, errno被设置
  • 参数:

    a. sockfd 表示socket创建的套接字文件描述符

    b. backlog 指定队列的容量

    这个队列用于记录正在连接但是还没有连接完成的客户端,一般设置队列的容量为2,3即可。队列的最大容量需要小于30
代码实例
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include void print_err(char *str, int line, int err_no) { printf("%d, %s :%s
",line,str,strerror(err_no));_exit(-1);
}int main()
{ int skfd = -1, ret = -1;skfd = socket(AF_INET, SOCK_STREAM, 0);if ( -1 == skfd) { print_err("socket failed",__LINE__,errno);}struct sockaddr_in addr;addr.sin_family = AF_INET; //设置tcp协议族addr.sin_port = 6789; //设置端口号addr.sin_addr.s_addr = inet_addr("192.168.102.169"); //设置ip地址ret = bind(skfd, (struct sockaddr*)&addr, sizeof(addr));if ( -1 == ret) { print_err("bind failed",__LINE__,errno);}/*将套接字文件描述符从主动转为被动文件描述符,然后用于被动监听客户端的连接*/ret = listen(skfd, 3);if ( -1 == ret ) { print_err("listen failed", __LINE__, errno);}return 0;
}
TCP服务器为什么调用listen

因为连接请求只能由客户端发起,此时服务端的listen函数是将服务端的主动描述符转为被动描述符,否则无法用于监听客户端的连接。

TCP服务器监听客户端链接时,使用的是socket返回的“套接字文件描述符”来实现的,但是这个文件描述符默认是主动文件描述符(主动向对方发送数据),所以需要使用listen函数将其转换为被动描述符(只能被动得等待别人主动发送数据,再回应),否则无法用于被动监听客户端。

更多相关:

  • 文章目录前言close函数介绍shutdown函数介绍 前言 这里在主要通过实例进行描述close函数在网络编程中的使用 TCP编程模型中客户端或者服务器只要主动通过close发起断开连接的请求,则通信连接可以中断。 可以通过在主进程中抓取通信端的断开信号,比如SIGINT,在信号处理函数中对该通信文件描述符进行关闭。...

  • 一.内存管理基本知识 1.S3C2440最多会用到两级页表:以段的方式进行转换时只用到一级页表,以页的方式进行转换时用到两级页表。页的大小有三种:大页(64KB),小页(4KB),极小页(1KB)。条目也称为"描述符",有:段描述符,大页描述符,小页描述符,极小页描述符——他们保存大页,小页,极小页的起始物理地址;粗页表描述符,细页表...

  • 关于点云的分割算是我想做的机械臂抓取中十分重要的俄一部分,所以首先学习如果使用点云库处理我用kinect获取的点云的数据,本例程也是我自己慢慢修改程序并结合官方API 的解说实现的,其中有很多细节如果直接更改源程序,可能会因为数据类型,或者头文件等各种原因编译不过,会导致我们比较难得找出其中的错误,首先我们看一下我自己设定的一个场景,...

  • /* 使用正态分布变换进行配准的实验 。其中room_scan1.pcd room_scan2.pcd这些点云包含同一房间360不同视角的扫描数据 */ #include #include #include #include

  • #include #include #include #include ...

  • #include #include #include #include #include #include...

  • #include #include #include #include int main (int argc,...

  • 文章目录前言函数描述代码实例如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的主动描述符转为被动描述符进行监听之后,接口accept通过三次握手与客户端建立连接 TCP 编程模型如下: 函数描述 #i...