06 TCP套接字之listen函数

本文详细介绍了TCP套接字中的listen函数,包括其函数原型、参数含义和调用时机。listen函数将主动套接字转换为被动套接字,用于等待客户端的连接请求。同时,它设置了未完成连接队列和已完成连接队列的最大长度,但这个长度并不直接影响系统的连接数量。在实际应用中,服务端通常需要先调用bind函数绑定IP和端口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前面介绍了客服端通过调用connect函数就能向服务端请求连接, 但是服务端如果不开启监听服务的话就根本不知道对端想要与之建立连接. 要想知道客户端想要连接就得调用listen函数


函数原型
#include <sys/socket.h>
int listen(int sockfd, int backlog);

成功 : 返回0;

失败 : 返回-1.


函数语义

假设由socket函数创建的套接字为主动套接字, 那么listen函数就是将主动套接字转为被动套接字, 调用connect函数将使主动套接字向对端发起连接请求, 当有被动套节时并满足必要条件就将主被套接字连接起来了.


函数参数
  • sockfd调用socket函数返回的文件描述符(套接字).

  • 未完成连接队列和已完成连接队列的上限.

    • 未完成连接队列 : 服务端还未完成三次握手全部过程的一个队列.

    • 已完成连接队列 : 服务端已经完成三次握手全部过程的一个队列, 等待accept函数从这个队列中返回下一个(返回其实是取出, 该套接字不在已完成队列中了)套接字.

      注意 : 两个队列分别的长度都不超过backlog设置的值. listen的第二个参数, 跟系统的链接数量没有任何关系, 相当于是设置一个瞬间能够处理的阈值.


函数调用
int ret;
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
ret = listen(sockfd, 5);
if(ret < 0) EXIT("listen");

调用listen函数之前可以不用调用bind函数, 这样端口是随机分配未使用的端口号. 但是这种做法不取就在于服务端的IP和端口一般都是熟知的, 不然对端很难连接过来, 所以最好要调用bind函数进行绑定.


总结
  • 服务端最好调用bind进行绑定
  • 参数backlog是未决连接的上限
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值