• Linux 网络编程详解九


    TCP/IP协议中SIGPIPE信号产生原因
    1.假设客户端socket套接字close(),会给服务器发送字节段FIN;
    2.服务器接收到FIN,但是没有调用close(),因为socket有缓存区,所以服务器仍然可以向客户端发送数据。
    3.如果这种状态下服务器向客户端发送数据,将会引起TCP/IP协议进行RST段重置,导致服务器向当前进程发送SIGPIPE信号,
      SIGPIPE信号的默认动作是关闭当前进程。
    SIGPIPE信号产生的本质原因是管道的一端已经关闭,另一端却继续写入数据。
    所以在网络编程中必须要捕捉SIGPIPE信号,因为不确定哪个端会突然close()。
    close()函数详解
    close()函数关闭文件读写两个数据传输方向。
    close()的本质是文件引用计数原理,例如进程在fork()之前打开一个文件描述符fd,那么子进程的文件描述符本质上是文件表中描述符引用加一,
    父进程中调用close(fd),文件表中描述符引用减一,直到子进程同样调用close(fd),文件表中描述符引用为0,此时文件才会真正关闭。
       在TCP/IP协议中,假设在服务器端,父进程负责accept()连接,子进程负责与客户端通信交互,如果一个客户端socket文件描述符,
    在父进程中没有调用close()函数关闭socket文件描述符,但是在子进程中调用close()函数关闭了socket文件描述符,那么子进程将无
    法使用这个socket文件描述符read()或者send()数据,但是这个socket文件描述符仍然存在,因为父进程还引用着这个socket文件描述
    符,文件表中的描述符引用不是0,因此服务器端不会向客户端发送FIN字节段,客户端就不会知道服务器端实际上已经无法read和send数据,
    导致客户端可以发送数据,却接收不到数据,并且网络TCP/IP协议的状态都是ESTABLISHED状态(已连接状态)。所以多进程的服务器端需
    要在父进程中关闭客户端socket文件描述符。
    shutdown()函数详解
    int shutdown(int sockfd, int how);
    功能:shutdown()函数也可以用来关闭文件描述符,但是可以通过参数how来设置单独的关闭文件的读或者写
    参数how
    --SHUT_RD    关闭文件读数据传输
    --SHUT_WR    关闭文件写数据传输
    --SHUT_RDWR    关闭文件读写数据传输
    shutdown的技术原理和close()函数不同,shutdown()函数不论文件表中文件描述符被引用了多少次,只要调用一次shutdown()函数,就可以真正意义上将文件关闭。
    shutdown一般用法是关闭文件单个的读写数据传输。
  • 相关阅读:
    网络操作系统(WebOS)网站
    各种邀请码:Evernote 3.0,wallop,qolin等等
    urlrewrite 的使用方法
    一次事故处理情况(mysql 相关)
    开始使用ubuntu办公
    Q邻:网络桌面
    数据库表字段命名规范
    计算机专业导学
    详解GCC的下载和安装
    三层的解释
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/6144244.html
Copyright © 2020-2023  润新知