《网络编程》-第7章 – 优雅地断开套接字连接

第7章 – 优雅地断开套接字连接

思想:

​ 只关闭一部分数据交换中使用的流 ( Half-close )。断开一部分连接是指,可以传输数据但无法接收,或可以接收数据但无法传输。顾名思义就是只关闭流的一半。

1、shutdown() 函数

#include <sys/socket.h>

int shutdown( int sock, int howto );

功能:

​ 关闭一部分数据交换中使用的流。

参数:

​ sock:需要断开的套接字文件描述符。

​ howto:传递断开方式信息。

​ SHUT_RD:断开输入流;(套接字无法接受数据)

​ SHUT_WD:断开输出流;(套接字无法发送数据)

​ SHUT_RDWD:同时断开I/O流。(相当于同时调用SHUT_RD, SHUT_WD)

返回值:

成功返回0, 失败返回-1。

2、【辨】

open() 与 fopen()

open() 是Linux系统自带函数调用 返回的是文件句柄,文件的句柄是文件在文件描述副表里的索引;

fopen()是C的库函数,返回的是一个指向文件结构的指针。

fopen()不能指定要创建文件的权限;open()可以指定权限.

fopen()返回指针,open()返回文件描述符(整数)

​ 文件描述符是linux下的一个概念,linux下的一切设备都是以文件的形式操作。如网络套接字、硬件设备等。当然包括操作文件。fopen()是标准c函数。返回文件流而不是linux下文件句柄。设备文件不可以当成流式文件来用,只能用open()。

read() 和 fread()

fread() 带有缓冲,是read() 的衍生

fread() 可以读一个结构。read() 在linux/unix中读二进制与普通文件没有区别。

3、习题

1) 解释TCP中“流”的概念。UDP中能否形成流?请说明原因?

TCP的流指,两台主机通过套接字建立连接后进入可交换数据的状态,也称为“流形成的状态”。而对于UDP来说,不存在流,因为两个SOCKET不能相互连接

2) Linux中的close函数或Windows中的closesocket函数属于单方面断开连接的方法,有可能带来一些问题。什么是单方面断开连接?什么情况下会出现问题?

单方面的断开连接意味着套接字无法再发送数据。一般在对方有剩余数据为发送完成时,断开己方连接,会造成问题。

3) 什么是半关闭?针对输出流执行半关闭的主机处于何种状态?半关闭会导致对方主机接收什么信息?

半关闭是指只完成输入和输出流中的一个。而且,如果对输出流进行半关闭,EOF无法被传送到对方主机,己方套接字无法传送数据,但可以接收对方主机传送的数据。

代码入口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值