TCP/IP网络编程学习(6):套接字的断开

单方面断开

之前讨论的close函数意味着连接完全的断开,既不能收数据也不能发数据。
在这里插入图片描述
主机A发送完最后 的数据后,调用 close函数断开了连接,之后主机A元法再接收主机B传输的数据 。实际上,是完全无法调用与接收数据相关的函数 。 最终,由主机B传输的、 主机A必须接收的数据也销毁了 。为了解决这类问题,“只关闭一部分数据交换中使用的流” ( Half-close ) 的方法应运而生 。 断开一部分连接是指,可以传输数据但无法接收 ,或可以接收数据但无法传输。 顾名思义就是只关闭流的一半 。

套接字和流

两台主机通过套接字建立连接后进入可交换数据的状态 , 又称"流形成的状态" 。 也就是把建立套接字后可交换数据的状态看作一种流。此处的流可以比作水流 。 水朝着一个方向流动,同样,在套接字的流中,数据也只能向一个方向移动 。 因此,为了进行双向通信,2个流 。
在这里插入图片描述
一旦两舍主机间建立了套接字连接,每个主机就会拥有单独的输入流和输出流 。 当然,其中一个主机的输入流与另一主机的输出流相连,而输出流则与另一主机的输入流相连 。 Linux的close和Windows的closesocket将同时断开这两个流。

使用shutdown函数关闭一个流,用于半关闭

int shutdown(int sock, int howto);
// 成功时返回 θ ,失败时返回-1
//sock 需要断开的套接字文件描述符。
//howto 传递断开方式信息。

调用上述函数时,第二个参数决定断开连接的方式,其可能值如下所示 。
SHUT_RD : 断开输入流 。无法接受数据。即使输入缓冲区的数据也会抹去,而且无法调 用输入函数。
SHUT_WR: 断开输出流 。中断输出流,也就无法传输数据 。但如果输出缓冲还留有未传输的数据,将传递至目标主机 。
SHUT_RDWR: 同时断开 I/O流 。 这相当于分2次调用shutdown ,其中一次以 SHUT_RD为参数,另一次以 SHUT_WR为参数。

为何需要半关闭

考虑如下问题:
客户端连接到服务器之后,服务器将大文件传递给客户端。收到后客户端发送字符串“ending"给服务端。

因为传输文件的服务器端只需连续传输文件数据即可,而客户端则无法知道需要接收数据到何时。 客户端也没办法无休止地调用输入函数,因为这有可能导致程序阻塞(调用的函数未返回)。服务器端应最后向客户端传递EOF表示文件传输结束 。 客户端通过函数返回值接收EOF 。

服务器如何传递EOF? " 断开输出流时向对方主机传输EOF。

当然,调用close函数的同时关闭 I/O流,这样也会向对方发送EOF 。 但此时无法再接收对方传输的数据 。 换言之,若调用close函数关闭流,就无法接收客户端最后发送的字符串 “ending” 。这时需要调用shutdown函数,只关闭服务器的输出流(半关闭)。 这样既可以发送EOF ,同时又保留了输入流,可以接收对方数据 。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值