今天继续socket编程的学习,最近晚上睡觉都没有发热,没有暖气的日子还是种煎熬,快乐的十一也已经走来,幸福有暖气的日子也快啦,好了,回到正题~

①close终止了数据传送的两个方向。
②shutdown可以有选择的终止某个方向的数据传送或者终止数据传送的两个方向。
但是,在实际应用中,可能会遇到这样一个情况,既使我们关闭了其中的某一端应用,但对于先前发送出去的数据能够得到对方的应答,下面可以用图来表示一下:
进一步说明一下"close终止了数据传送的两个方向":
查看一下man帮助:
①、SHUT_RD=1代表不能向管道中读取数据了。
②、SHUT_WR代表不能向管道中写入数据了。
③、SHUT_RDWR代表不能向管道中读写数据了。
所以正好反映了,"shutdown可以有选择的终止某个方向的数据传送或者终止数据传送的两个方向"。
【说明】:
 
③shutdown how=1就可以保证对等方接收到一个EOF字符【也就是向对方发送了FIN TCP段】,而不管其他进程是否已经打开了套接字。而close不能保证,直到套接字引用计数减为0时才发送。也就是说直到所有的进程都关闭了套接字。

对于上面提到的,要想让client只终止写的一端,可以用shutdown设置成SHUT_WR,也就是how=1:

从上面的解释中来看:"close不能保证,直到套接字引用计数减为0时才发送。也就是说直到所有的进程都关闭了套接字",并不是只要调用了close就会立马向对方发送FIN tcp段,而是需要引用计数减为0时才发送,回想一下原来用fork()实现服务端的代码:

而如果改用shutdown:

说了一系列理论过后,下面用实验来进一步加深对shutdown的理解,也就是用shutdown来改写客户端。

目前我们的回射客户/服务端程序都已经改用select函数来实现了,下面我们来做一个这样的实验:

为了进行以上实验流程,需要改造一下实验环境,于是乎需小调整一下代码:

echocli.c:

echosrv.c:

下面来看下效果:

可见,并没回将数据回射回客户端,并且客户端这边报了一个错:

这是哪打印出来的呢?分析一下代码流程:

而且客户端的这个错误,还会导致服务端也崩溃掉了。

那如果这样处理是否可以避免这个报错呢?

编译运行:

可以看出,客户端并没有报错了,但是服务端还是崩溃了,这是为什么呢?

所以,解决服务端崩溃很简单,处理如下:

再次编译运行:

这时,可以看到服务端打印了"client close",而且没有崩溃了,这是由于执行到了这个流程:

但是目前残留在管道当中的数据都无法回显给客户端,所以接下来用shutdown来进行改进,让它在客户端关闭的情况下还能回射回来:

编译如下:

从上面可以看到,客户端成功回显了,但是,发现有个小问题,就是当客户端回显数据之后,服务端没有把客户端给关闭掉,所以,程序应该有个bug,检查一下服务端的代码:

所以,修改如下:

编译运行:

这时问题就成功解决,此时的客户端就相对要完善一些了,实际上在编写TCP程序时是需要考虑到这一点的,实际上客户端程序还有一个地方是需要注意的:

所以可以加入一个flag进行处理:

当然程序运行效果是一样的,只是程序更严谨一些,好了,下次学习继续~

linux网络编程之socket编程(十)的更多相关文章

  1. linux网络编程之socket编程(十六)

    继续学习socket编程,今天的内容会有些难以理解,一步步来分解,也就不难了,正入正题: 实际上sockpair有点像之前linux系统编程中学习的pipe匿名管道,匿名管道它是半双工的,只能用于亲缘 ...

  2. linux网络编程之socket编程(十五)

    今天继续学习socket编程,这次主要是学习UNIX域协议相关的知识,下面开始: [有个大概的认识,它是来干嘛的] ①.UNIX域套接字与TCP套接字相比较,在同一台主机的传输速度前者是后者的两倍. ...

  3. linux网络编程之socket编程(十二)

    今天继续学习socket编程,期待的APEC会议终于在京召开了,听说昨晚鸟巢那灯火通明,遍地礼花,有点08年奥运会的架势,有种冲动想去瞅见一下习大大的真容,"伟大的祖国,我爱你~~~&quo ...

  4. linux网络编程之socket编程(十四)

    经过令国鸡冻的APEC会之后,北京的冬天终于不冷了,有暖气的日子就是倍儿爽呀~~洗完热水澡,舒服的躺在床上欢乐地敲打着键盘,是件多么幸福的事呀,好了,抒发情感后,正题继续. 上节中已经初步学习了UDP ...

  5. linux网络编程之socket编程(四)

    经过两周的等待,终于可以回归我正常的学习之旅了,表哥来北京了在我这暂住,晚上回家了基本在和他聊天,周末带他在北京城到处乱转,几乎剥夺了我自由学习的时间了,不过,亲人之情还是很难得的,工作学习并不是生活 ...

  6. linux网络编程之socket编程(一)

    今天开始,继续来学习linux编程,这次主要是研究下linux下的网络编程,而网络编程中最基本的需从socket编程开始,下面正式开始学习: 什么是socket: 在学习套接口之前,先要回顾一下Tcp ...

  7. linux网络编程之socket编程(六)

    经过一个国庆长假,又有一段时间没有写博文了,今天继续对linux网络编程进行学习,如今的北京又全面进入雾霾天气了,让我突然想到了一句名句:“真爱生活,珍惜生命”,好了,言归正传. 回顾一下我们之间实现 ...

  8. linux网络编程之socket编程(八)

    学习socket编程继续,今天要学习的内容如下: 先来简单介绍一下这五种模型分别是哪些,偏理论,有个大致的印象就成,做个对比,因为最终只会研究一个I/O模型,也是经常会用到的, 阻塞I/O: 先用一个 ...

  9. linux网络编程之socket编程(七)

    今天继续学习socket编程,北京在持续几天的雾霾天之后久违的太阳终于出来了,心情也特别特别的好,于是乎,在这美好的夜晚,该干点啥事吧,那当然就是继续坚持我的程序学习喽,闲话不多说,进入正题: 通过这 ...

随机推荐

  1. beautifulsoup 模块

    一.介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你 ...

  2. 最新 博盾习言java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿. 博盾习言等10家互联网公司的校招Offer,因为某些自身原因最终选择了 博盾习言.6.7月主要是做系统复习.项目复盘.Le ...

  3. PHP替代session的方法

    PHP替代session的方法 服务器集群的时候 会发现session的问题 一般采用redis 来代替 用账号作为key 因为redis能主从 所以打算用替代session的方法1 cookie代替 ...

  4. php设计模式;抽象类、抽象方法

    设计模式 什么叫设计模式 所谓设计模式,就是一些解决问题的“常规做法”,是一种认为较好的经验总结.面对不同的问题,可能会有不同的解决办法,此时就可以称为不同的设计模式. 工厂模式 在实际应用中,我们总 ...

  5. kafka那些事儿

    1 为什么用消息队列 1)解耦.服务之间没有强依赖,不需要关心调用服务时出现的各种异常,服务挂掉后接口超时等问题 2)异步.解决接口调用多服务时延时高的问题 3)高峰期服务间缓冲.解决工作节奏不一致问 ...

  6. SQL 先固定特殊的几行数据之外再按照某一字段排序方法(CASE 字段排序(CASE WHEN THEN)

    查询用户表的数据,管理员用户始终在最前面,然后再按照CreateTime排序: SELECT TOP * FROM [dbo].[User] WHERE ParentID = '**' ORDER B ...

  7. 【springcloud】2.eureka源码分析之令牌桶-限流算法

    国际惯例原理图 代码实现 package Thread; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomi ...

  8. AtomicIntegerFieldUpdater和AtomicInteger

    为什么有了AtomicInteger还需要AtomicIntegerFieldUpdater? 当需要进行原子限定的属性所属的类会被创建大量的实例对象, 如果用AtomicInteger, 每个实例里 ...

  9. Python 命令行模块使用技巧

    命令行参数传递 python main.py -H 192.168.1.1 -p 22,23,24 #coding:utf-8 import optparse def PortScan(host,po ...

  10. Angular 学习笔记 (动态组件 & Material Overlay & Dialog 分析)

    更新: 2019-11-24  dialog vs router link refer : https://stackoverflow.com/questions/51821766/angular-m ...