《Linux网络编程》: connect()、listen()和accept()

本文详细介绍了TCP网络编程中,客户端的connect()、服务器的listen()和accept()函数的工作原理及流程。connect()用于客户端发起连接请求,listen()使服务器进入被动连接状态,并设置连接队列长度,accept()则从已完成连接队列中取出连接。文中还探讨了backlog参数对连接队列的影响,并通过实例说明了Linux系统在连接队列满时的处理方式,揭示了实际行为与理论描述的差异。

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

基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下:

connect()函数

对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三次握手,而这个连接的过程是由内核完成,不是这个函数完成的,这个函数的作用仅仅是通知 Linux 内核,让 Linux 内核自动完成 TCP 三次握手连接(三次握手详情,请看《TCP 三次握手和四次挥手》),最后把连接的结果返回给这个函数的返回值(成功连接为0, 失败为-1)。


通常的情况,客户端的 connect() 函数默认会一直阻塞,直到三次握手成功或超时失败才返回(正常的情况,这个过程很快完成)。
listen()函数

对于服务器,它是被动连接的。举一个生活中的例子,通常的情况下,移动的客服(相当于服务器)是等待着客户(相当于客户端)电话的到来。而这个过程,需要调用listen()函数。

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

listen() 函数的主要作用就是将套接字( sockfd )变成被动的连接监听套接字(被动等待客户端的连接),至于参数 backlog 的作用是设置内核中连接队列的长度(这个长度有什么用,后面做详细的解释),TCP 三次握手也不是由这个函数完成,listen()的作用仅仅告诉内核一些信息。


这里需要注意的是,listen()函数不会阻塞,它主要做的事情为,将该套接字和套接字对应的连接队列长度告诉 Linux 内核,然后,listen()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值