accept 阻塞_第五十章、accept函数和close函数

上一章了解了listen函数,这一章在学习两个函数:accept和close

我们先来看下accept函数,accept函数是从监听套接字的完成连接队列中接收一个连接,如果完成连接队列为空,那么这个进程休眠。

我们还是一样,先来看下它的定义:

int accept (int __fd, __SOCKADDR_ARG __addr,socklen_t *__restrict __addr_len)

我们来看下它的参数有哪些:

1、 fd:指定套接字描述符

2、 addr:指向一个Internet套接字地址结构的指针

3、 Addr_len:指向一个无符号整形变量的指针。

accept执行成功是返回3个结果:返回一个新的套接字描述符,标识这个接收的连接,addr指向结构变量中存储客户机地址,addr_len指向的整形变量中存储客户机地址的长度,如果对客户机的地址和长度都不感兴趣,可以将参数addr和addr_len设置为NULL。

若accept执行失败,返回-1。

当函数accept阻塞等待已经建立连接时,如果进程捕获到信号,那么函数将以错误返回返回,错误类型为EINTR。对于这种错误,一般重新调用函数accept来接收连接。

接下来我们再来看一下close函数

close函数,顾名思义它是用来关闭的,它的作用是关闭一个套接字描述符。

要使用close函数需要引入unistd.h头文件

我们来看下它的定义:int close (int __fd);

参数fd就是要关闭的套接字描述符。函数close执行成功时返回0,否则返回-1.

套接字描述符的close操作和文件描述符的close操作一样,close将套接字描述符的引用计数减一,如果描述符的引用计数大于0,则表示还有进程引用这个描述符,函数close正常返回,如果描述符的引用计数变为0,则表示在没有进程引用这个描述符,于是启动清除套接字描述符的操作,函数close立即正常返回。

调用close之后,进程将不再能访问这个套接字,但是这不表示TCP协议删除了这个套接字,TCP协议将继续使用这个套接字,将尚未发送的数据传递到对方,然后发送FIN数据段,执行关闭操作。一直等到这个TCP连接完全关闭滞后,TCP协议才删除这个套接字。

好了我们来看下代码吧:

f8de790258af4ffdbf6b35537dbfaae2

好了今天就到这里吧,如果大家喜欢的话请加关注哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值