close()和shutdown()函数

一·close(int sockfd)

  当server和client建立连接,server调用close(),则server发送fin给client,server不在通过该套接字继续传送消息或者接收消息,此时client调用read,如果接收到fin则返回0,但是此时的client还是可以write给server,并且write只是将信息发送给缓冲区,当server收到该数据报会返回一个rst数据报连接重置,表示server不再接受消息,如果要传送消息,则需要连接重置。client接收到RST后并不会直接传送给应用层,只是将该状态保存在TCP协议层,当client再次调用write给server时,因为连接已经处于RST状态,则不再有数据发出,而是SIGPIPE一个信号给应用层.仅此计数为0时才关闭套接字,发送TCP的正常连接终止序列

  并且该函数并不是真正的四分组终止序列,而是将描述符的访问计数-1,

二·shutdown(int sockfd,int howto)

  1>close将描述符的访问计数-1,只有在此计数为0时关闭套接字。用shutdown激发TCP的正常连接终止序列,而不管访问计数。

  2>close终止了数据传送的两个方向:读和写。由于TCP连接数全双工的,有很多时候要通知另一端已完成了数据发送,即使另一端有很多数据要发送也是如此,shutdown函数可以仅仅关闭连接的读,写或两个方向都关闭

  howto:

  1.SHUT_RD 关闭连接的读一半,不再接受套接口的数据,而且留在套接口接收缓冲区中的数据都作废,进程不能再对套接口执行任何读进程。调用此函数后,TCP套接口接受的数据被接收,但数据本身被扔掉。

  2.SHUT_WD 关闭连接的写一半 此情况称为半关闭,当前留在套接口发送给缓冲区的数据都被发送,后跟正常的TCP终止序列,进程不能在执行对套接口的任何写函数。

  3.SHUT_RDWR 连接的读这一半和写这一半都关闭,等同于调用函数shutdown()两次,第一次调用时用SHUT_RD,第二次调用时用SHUT_WR。

  

时间: 2024-08-04 10:19:51

close()和shutdown()函数的相关文章

close和shutdown函数的区别

close函数首先是将传入的socket句柄引用数减1(因为fork进程时会导致socket句柄被多个进程引用),待到引用数等于0的时候,close才会真正关闭连接. shutdown函数是立刻关闭连接(忽视句柄引用数值),关闭有三种方式 SHUT_RD 关闭调用进程的读通道,调用进程立刻不能读网络数据,读缓冲里的数据会被清空 SHUT_WR 关闭调用进程的写通道,调用进程立刻不能写网络数据,写缓冲里的数据立刻会被发送出去 SHUT_RDWR 关闭整个连接 close和shutdown函数

close与shutdown函数

linux网络编程之socket(十):shutdown 与 close 函数的区别 socket中关闭套接字的函数close和shutdown区别 #include <unistd.h> int close(int fd); close 关闭了自身数据传输的两个方向.关闭本进程的socket id,但链接还是开着的,用这个socket id的其它进程还能用这个链接,能读或写这个socket id #include <sys/socket.h> int shutdown(int s

shutdown函数

#include <sys/socket.h> int shutdown(int sockfd, int howto); 返回:若成功则为0,若出错则为-1 (1)该函数的行为依赖于howto参数的值: SHUT_RD   关闭连接的读这一半:套接字中不再有数据可接收,而且套接字接收缓冲区中的现有数据都被丢弃 SHUT_WR  关闭连接的写这一半:不再发送数据,而且套接字发送缓冲区中的现有数据都被丢弃 SHUT_RDWR  现有的读半部和写半部都被关闭 (2)调用shutdown关闭一半TCP

linux网络编程之shutdown() 与 close()函数详解

linux网络编程之shutdown() 与 close()函数详解 参考TCPIP网络编程和UNP: shutdown函数不能关闭套接字,只能关闭输入和输出流,然后发送EOF,假设套接字为A,那么这个函数会关闭所有和A相关的套接字,包括复制的:而close能直接关闭套接字. 1.close()函数 [cpp] view plain copy print? <span style="font-size:13px;">#include<unistd.h> int 

socket shutdown 与 close 函数 的区别

假设server和client 已经建立了连接,server调用了close, 发送FIN 段给client(其实不一定会发送FIN段,后面再说),此时server不能再通过socket发送和接收数据,此时client调用read,如果接收到FIN 段会返回0,但client此时还是可以write 给server的,write调用只负责把数据交给TCP发送缓冲区就可以成功返回了,所以不会出错,而server收到数据后应答一个RST段,表示服务器已经不能接收数据,连接重置,client收到RST段

shutdown和close的区别

[shutdown和close的区别] 当所有的数据操作结束以后,你可以调用close()函数来释放该socket,从而停止在该socket上的任何数据操作:close(sockfd); 你也可以调用shutdown()函数来关闭该socket.该函数允许你只停止在某个方向上的数据传输,而一个方向上的数据传输继续进行.如你可以关 闭某socket的写操作而允许继续在该socket上接受数据,直至读入所有数据. int shutdown(int sockfd,int how); Sockfd是需要

网络编程中shut_down和close()函数的区别

在Linux C网络编程中,一共有两种方法来关闭一个已经连接好的网络通信,它们就是close函数和shutdown函数,它们的函数原型分别为: 1 #include<unistd.h> 2 int close(int sockfd) 3 //返回:0--成功, 1--失败 4   5 #include<sys/socket.h> 6 int shutdown(int sockfd, int howto) 7 //返回:0--成功, 1--失败 对一个tcp socket调用clos

close函数

int close(int sockfd); close一个TCP套接字的默认行为是把该套接字标记成已关闭,然后立即返回到调用进程, 该套接字描述符不能再由调用进程使用,也就是说它不能再作为read或write的第一个参数 并发服务器中父进程关闭已连接套接字只是导致相应描述符的引用数值减1,既然引用数值仍大于0,这个close调用并不引发TCP的四分组连接终止序列 对于父进程与子进程共享已连接套接字的并发服务器来说,这正是所期望的 如果我们确实想在某个TCP连接上发送一个FIN,那么可以改用sh

PHP函数库(other)

PHP函数库(other) Session函数: session_abort — Discard session array changes and finish session session_abort() finishes session without saving data. Thus the original values in session data are kept. 返回值:没有你返回值. session_cache_expire — 返回当前缓存的到期时间 session_