zoukankan      html  css  js  c++  java
  • socket关闭的close和shutdown区别

    转自:http://hi.baidu.com/yoshubom/blog/item/caa3b2de5d210559cdbf1a2b.html

    socket关闭close和shutdown

    socket关闭有2个close,shutdown

    他们之间的区别:

    close-----关闭本进程的socket id,但链接还是开着的,用这个socket id的其它进程还能用这个链接,能读或写这个socket id

    shutdown--则破坏了socket 链接,读的时候可能侦探到EOF结束符,写的时候可能会收到一个SIGPIPE信号,这个信号可能直到

    socket buffer被填充了才收到,shutdown还有一个关闭方式的参数,0 不能再读,1不能再写,2 读写都不能。

    ===============================================================================================================

    socket 多进程中的shutdown, close使用
    当所有的数据操作结束以后,你可以调用close()函数来释放该socket,从而停止在该socket上的任何数据操作:
    close(sockfd);


    你也可以调用shutdown()函数来关闭该socket。该函数允许你只停止在某个方向上的数据传输,而一个方向上的数据传输继

    续进行。如你可以关闭某socket的写操作而允许继续在该socket上接受数据,直至读入所有数据。
    int shutdown(int sockfd,int how);
    Sockfd是需要关闭的socket的描述符。参数 how允许为shutdown操作选择以下几种方式:
        SHUT_RD:关闭连接的读端。也就是该套接字不再接受数据,任何当前在套接字接受缓冲区的数据将被丢弃。进程将不能对该

    套接字发出任何读操作。对TCP套接字该调用之后接受到的任何数据将被确认然后无声的丢弃掉。
        SHUT_WR:关闭连接的写端,进程不能在对此套接字发出写操作
        SHUT_RDWR:相当于调用shutdown两次:首先是以SHUT_RD,然后以SHUT_WR


    使用close中止一个连接,但它只是减少描述符的参考数,并不直接关闭连接,只有当描述符的参考数为0时才关闭连接。
    shutdown可直接关闭描述符,不考虑描述符的参考数,可选择中止一个方向的连接。

    注意:
        1>. 如果有多个进程共享一个套接字,close每被调用一次,计数减1,直到计数为0时,也就是所用进程都调用了close,套

    接字将被释放。
        2>. 在多进程中如果一个进程中shutdown(sfd, SHUT_RDWR)后其它的进程将无法进行通信. 如果一个进程close(sfd)将不会

    影响到其它进程. 得自己理解引用计数的用法了. 有Kernel编程知识的更好理解了.

    同事发现的该问题, 认为很重要就记下了!
  • 相关阅读:
    eclipse下c/cpp " undefined reference to " or "launch failed binary not found"问题
    blockdev 设置文件预读大小
    宝宝语录
    CentOS修改主机名(hostname)
    subprocess报No such file or directory
    用ldap方式访问AD域的的错误解释
    英特尔的VTd技术是什么?
    This virtual machine requires the VMware keyboard support driver which is not installed
    Linux内核的文件预读详细详解
    UNP总结 Chapter 26~29 线程、IP选项、原始套接字、数据链路访问
  • 原文地址:https://www.cnblogs.com/zjp-blog/p/12547368.html
Copyright © 2011-2022 走看看