shutdown系统调用】的更多相关文章

/* * Shutdown a socket. */ SYSCALL_DEFINE2(shutdown, int, fd, int, how) { int err, fput_needed; struct socket *sock; /* 找到socket */ sock = sockfd_lookup_light(fd, &err, &fput_needed); if (sock != NULL) { err = security_socket_shutdown(sock, how);…
概述 shutdown系统调用在tcp层会调用两个函数,对于ESTABLISHED状态需要调用tcp_shutdown关闭连接,对于LISTEN和SYN_SENT状态则需要以非阻塞模式调用tcp_disconnect断开连接:本文除了对这两个函数进行分析以外,还会分析在shutdown关闭了读或者写之后,读写系统调用sendmsg和recvmsg将如何处理对应操作: /* 关闭操作 */ int inet_shutdown(struct socket *sock, int how) { /*..…
使用多线程时,pthread_create的参数flag有CLONE_FILES, 最终调用do_fork(),并且会根据CLONE_FILES标志来调用copy_files()来共享父进程中的文件描述符(这里包括socketfd). 使用多进程时,fork的参数flag没有CLONE_FILES, 最终调用do_fork(),子进程会把文件描述符的引用计数加一,即把struct files_struct成员f_count++. 在单进程.单线程.多线程时,close()会调用tcp_close…
通过两种方式可以关闭一个socket:close和shutdown.直接调用close关闭socket存在以下两个问题: 1. close只是将socket 描述字的访问计数减1,仅当描述字的访问计数为0时,才真正的关闭socket. 2.close终止了数据传输的两个方向:读与写.tcp管道是全双工的,有时候我们仅仅是想通知另一端我们已经完成了数据的发送,但还想继续接收另一端发送过来的数据,在这种情况下调用close关闭socket是不合适的. shutdown可以解决上面关于close的两个…
shutdown 系统调用关闭连接的读数据通道  写数据通道 或者 读写数据通道: 关闭读通道:丢弃socket fd 读数据以及调用shutdown 后到达的数据: 关闭写通道:不同协议处理不同:tcp协议,将所有的数据发送完成,发送完后发送FIN: 但是为了删除套接字和释放文件描述符,我们必须使用close();进程结束时,会调用close: enum sock_shutdown_cmd { SHUT_RD,// 关闭读 SHUT_WR,//关闭写 SHUT_RDWR,//关闭读写 }; i…
终止一个连接要经过4次握手.这由TCP的半关闭(half-close)造成的.既然一个TCP连接是全双工(即数据在两个方向上能同时传递,可理解为两个方向相反的独立通道),因此每个方向必须单独地进行关闭.这原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向连接.当一端收到一个FIN,内核让read返回0来通知应用层另一端已经终止了向本端的数据传送.发送FIN通常是应用层对socket进行关闭的结果. 例如:TCP客户端发送一个FIN,用来关闭从客户到服务器的数据传送. 半关闭对服…
问题聚焦:     本节从如下四个方面讨论TCP协议:     TCP头部信息:指定通信的源端端口号.目的端端口号.管理TCP连接,控制两个方向的数据流     TCP状态转移过程:TCP连接的任意一端都是一个状态机     TCP数据流:两种主要类型:交互数据流,成块数据流     TCP数据流的控制:保证可靠传输和提高网络通信质量,两个方面:超时重传,拥塞控制 1 TCP服务的特点 传输层协议:TCP协议.UDP协议 TCP协议相对于UDP协议的特点:面向连接.字节流和可靠传输.      …
转自:https://www.2cto.com/net/201309/243585.html(相关链接) 深入浅出TCP之半关闭与CLOSE_WAIT 终止一个连接要经过4次握手.这由TCP的半关闭(half-close)造成的.既然一个TCP连接是全双工(即数据在两个方向上能同时传递,可理解为两个方向相反的独立通道),因此每个方向必须单独地进行关闭. 这原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向连接.当一端收到一个FIN,内核让read返回0来通知应用层另一端已经终止…
5.1   socket地址API 大端字节序(网络序):高位在低址,低位在高址 小端字节序(主机序):低位在低址,高位在高址 判断,利用联合的特性: #include <iostream> using namespace std; int main() { union { int value; char union_bytes[ sizeof(int) ]; } test; test.value = 0x01020304; ;i < ;i++) cout<<test.uni…
终止一个连接要经过4次握手.这由TCP的半关闭(half-close)造成的.既然一个TCP连接是全双工(即数据在两个方向上能同时传递,可理解为两个方向相反的独立通道),因此每个方向必须单独地进行关闭. 这原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向连接.当一端收到一个FIN,内核让read返回0来通知应用层另一端已经终止了向本端的数据传送.发送FIN通常是应用层对socket进行关闭的结果. 例如:TCP客户端发送一个FIN,用来关闭从客户到服务器的数据传送. 半关闭对…