上一章了解了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协议才删除这个套接字。
好了我们来看下代码吧:
好了今天就到这里吧,如果大家喜欢的话请加关注哦。