通常来说,socket是双向的,即数据是双向通信的。但有些时候,你会想在socket上实现单向的socket,即数据往一个方向传输。

单向的socket便称为半开放Socket。要实现半开放式,需要用到shutdown()函数。

一般来说,半开放socket适用于以下场合:

(1)当你想要确保所有写好的数据已经发送成功时。如果在发送数据的过程中,网络意外断开或者出现异常,系统不一定会返回异常,这是你可能以为对端已经接收到数据了。这时需要用shutdown()来确定数据是否发送成功,因为调用shutdown()时只有在缓存中的数据全部发送成功后才会返回。

(2)想用一种方法来捕获程序潜在的错误,这错误可能是因为往一个不能写的socket上写数据,也有可能是在一个不该读操作的socket上读数据。当程序尝试这样做时,将会捕获到一个异常,捕获异常对于程序排错来说是相对简单和省劲的。

(3)当您的程序使用了fork()或者使用多线程时,你想防止其他线程或进程访问到该资源,又或者你想立刻关闭这个socket,那么可以用shutdown()来实现。

另外说一下,如果调用了Close()函数,程序中只是确保了对于某个特定的进程或线程来说,该连接是关闭的;但socket只有在所有的进程调用了Close()或者socket超出了工作范围时,才会真正的被关闭或删除。而如果想立刻关闭socket,那么可以通过shutdown()来实现。

shutdown()的调用是需要一个参数:0代表禁止下次的数据读取;1代表禁止下次的数据写入;2代表禁止下次的数据读取和写入。

同时,shutdown()的效果是累计的,不可逆转的。既如果关闭了一个方向数据传输,那么这个方向将会被关闭直至完全被关闭或删除,而不能重新被打开。如果第一次调用了shutdown(0),第二次调用了shutdown(1),那么这时的效果就相当于shutdown(2),也就是双向关闭socket。
--------------------- 
作者:moxiaomomo 
来源:CSDN 
原文:https://blog.csdn.net/moxiaomomo/article/details/7897943 
版权声明:本文为博主原创文章,转载请附上博文链接!

Socket之shutdown()用法相关推荐

  1. c语言 system() 之控制dos;shutdown 用法

    知识点 system函数    功 能: 发出一个DOS命令    用 法:头文件  #include<stdlib.h>    int system(char *command); DO ...

  2. ShutDown用法及参数

    用法: shutdown [-i | -l | -s | -r | -a] [-f] [-m computername] [-t xx] [-c "comment"] [-d up ...

  3. socket 函数 setsockopt()用法

    资料来源: 微软MSDN在线帮助 setsockopt(s, level, optname, optval, optlen) 函数 https://msdn.microsoft.com/library ...

  4. qt 下 原生socket tcp 基本用法

    qt中使用socket, 首先要包含windows.h头文件 还要在pro文件中,增加:LIBS += -lpthread libwsock32 libws2_32 引入相关函数的库 TCP 稳定传输 ...

  5. Shutdown用法

    下面我就介绍一个在Windows XP下实现定时关机的简单方法 指定系统在22分钟后自动关闭:点击"开始→运行",在"打开"中输入命令"Shutdow ...

  6. python3 socket shutdown 简介

    如果要表示输出数据已经结束,则可以通过关闭 socket 来实现.但如果彻底关闭了 socket,则会导致程序无法再从该 socket 中读取数据. 在这种情况下,socket 提供了一个 shutd ...

  7. socket关闭close和shutdown

    转载:http://blog.sina.com.cn/s/blog_693de6100101eusw.html 概述 socket关闭有2个方法close,shutdown ,2个方法的用法需要注意 ...

  8. linux socket 错误 Transport endpoint is not connected 在 recv shutdown 中的触发时机

    1.recv触发情况 用错了socket,把监听socket 和 连接socket 错误使用.实例如下: for(;;){socklen_t len = sizeof(client_address); ...

  9. socket UDP TCP 的一些用法

    UDP 用最通俗的话讲,所谓UDP,就是发送出去就不管的一种网络协议.因此UDP编程的发送端只管发送就可以了,不用检查网络连接状态.下面用例子来说明怎样编写UDP,并会详细解释每个API和数据类型. ...

最新文章

  1. 熬了几个大夜,学完一套985博士总结的OpenCV学习笔记(20G高清/PPT/代码)
  2. Mysql my.cnf配置文件记录
  3. 专业软件测试面试题汇总
  4. Java—遍历集合的N种方式总结Collections工具类
  5. html如何做幻灯片效果,超酷的CSS3幻灯片效果
  6. PJSIP添加G729编码
  7. 路由器的下一跳计算(网关)
  8. 人工智能AI 生成的艺术:从文本到图像
  9. C 语言面试题大汇总
  10. 大学计算机考试知识点归纳总结,大学计算机基础重点归纳.doc
  11. VS1005 HiRes 高清录音开发模块 BOB MK2
  12. android 列表倒计时,Android ListView列表实现倒计时
  13. css鼠标划过时的一些小特效
  14. maya刷权重时有个叉_为什么maya刷权重 笔刷是打叉
  15. python国际象棋ai程序_只需五步!手把手教你搭建国际象棋AI机器人
  16. 给你的Pycharm装一个漂亮的“皮肤“
  17. QML Tumbler使用介绍
  18. protobuf根据有关联的.proto文件进行编译
  19. 利用Python实现四则运算
  20. 企业级容器技术docker(12)docker swarm

热门文章

  1. 7.3国服人口最多的服务器,魔兽国服人口普查:总人口稳定 双阵营法师增长
  2. 数据库表中常用的查询实验
  3. 服务器cpu散热器性能,消费级散热器见多了,服务器的Xeon Platinum用什么散热器呢?...
  4. ITFLY8架构师之家公众号试运营
  5. ubuntu curl: not found
  6. 无贡献、无创新、无思路,ML领域准博士求助:论文到底要怎么创新? | Reddit热议...
  7. 简单几部思路清晰的教会你配置 Lamp(apache+mysql+php)的配置
  8. 某腾LOL开发负责人教你如何用Java实现一把 LOL 案例,学会模板设计模式!
  9. 我的计算机老师200字,我的老师作文200字
  10. 云服务中消灭小黄图的大宝剑---X次元口袋