之前用的方法不够优雅是因为,我们是调用close或closesocket函数单方面断开连接。
1.解释TCP中“流”的概念。UDP中能否形成流?请说明原因。
答:两台主机通过套接字建立连接后进入可交换数据的状态,又称“流形成的状态”。也就是把建立套接字后可交换数据的状态看作是一种流,此处的流可以比作水流,水朝着一个方向流动,同样,在套接字的流中,数据也只能向一个方向移动,因此,为了进行双向通信,需要2个流。
2.UDP中能否形成流?请说明原因。
答:UDP不能形成流, SOCK_DGRAM 表明数据将是数据报(datagrams)的形式。
3.Linux中的close函数或windows中的closesocket函数属于单方面断开连接的方法,有可能带来一些问题。什么是单方面断开连接,什么情况下会出现问题?
答:close函数断开连接意味着完全断开连接,完全断开不仅指无法传输数据,而且不能接受数据。比如主机A发送完最后的数据后,调用close函数断开了连接,之后主机A无法再接受主机B传输的数据。实际上,是完全无法调用与接收数据相关的函数,最终,由主机B传输的,主机A必须接收的数据也就销毁了。
4.什么是半关闭?针对输出流执行半关闭的主机处于何种状态?半关闭会导致对方主机接受什么消息?
答:半关闭函数:int shutdown(int sockfd,int howto)
sockfd:需要断开的套接字文件描述符
howto:传递断开方式信息
第二个参数:SHUT_RD:断开输入流,SHUT_WR:断开输出流,SHUT_RDWR:同时断开I/O流。