今天在做一个socket通信的时侯,发现close后,阻塞的read函数并没有马上返回,导致后面的时序出现问题,具体情况如下:
服务端与客户端正常建立通信,都采用阻塞模式。当客户端close后,服务端阻塞的read函数并没有马上返回,并且此时在服务端还可以向此连接写入数据,并成功,然后客户端又成功读到数据,接着服务端阻塞的read函数返回<0,表示断开连接。
以上客户端主动Close,服务端阻塞的read函数没有马上返回的现象与理想不符。后查阅,发现windows与linux在这点上不一样,在window是上,closeSocket,阻塞的recv函数会马上返回,但是linux上并不是这样。

为解决这个问题,尝试了如下方法:
1. int shutdown(int sockfd,int how); 此函数可禁止在一个套接口上进行数据的接收与发送。其他博客有说明,在close前调用此函数可以使阻塞的read函数立即返回,但是我每调用此函数机器会重启,这里并不知道具体原因,所以放弃了这个方法。
2. 设置LINGER参数,setsockopt(socket_fd, SOL_SOCKET, SO_LINGER, &so_linger, sizeof so_linger); 将延时参数设置为0,强制关闭套接口;但是结果并不理想,也放弃;
3. 在客户端欲关闭连接之前,先发送一个自定义消息,客户端再close,服务端收到该标志消息后也close,于是正常断开连接;个人觉得,此方法虽然能够解决问题,但总是觉得很牵强。但是最钟还是采用了这种方式。

Linux下客户端主动Close,服务端阻塞的read函数不会马上返回相关推荐

  1. Linux下yum安装SVN服务端

    Linux下yum安装SVN服务端 1.查看yum是否安装 2.安装svn 3.创建目录并配置 4.用户密码passwd配置 5.权限控制authz配置 6.服务svnserve.conf配置 7.启 ...

  2. ubuntu linux 下建立 纯L2TP 服务端和客户端

    以下是从网上摘下,并亲测可行的方法. 一.服务端 使用环境: System: Ubuntu 10.04 Desktop Package:xl2tpd 1. 安装所需软件包. apt-get insta ...

  3. linux c 客户端与 golang 服务端通信(网络字节序)

    网络二进制数据转换: 总所周知,数据在tcp网络传输协议中传输的字节序是大端模式的,换句话说如果你要传输一个int32型的整数,那么假设其二进制小端模式表示为111111111111111100000 ...

  4. Linux Socket 两个客户端通信,服务端作为中转

    Socket 两个客户端通信,服务端作为中转 Socket两个客户端通信,服务端作为中转,通过sockket的通信原理,简单的做了一个以c语言写的服务端,与自己制作的Android app 与树莓派为 ...

  5. Unity中进行网络通信:三:unity客户端和Unity服务端互相发消息

    目录 一.目的 1.想知道:Unity中进行网络通信:unity客户端和Unity服务端互相发消息 二.参考 1.unity3D中使用Socket进行数据通信(三) 三.操作:一:完成:在同一个Uni ...

  6. 【Linux】ubuntu安装ssh服务端openssh-server

    [Linux]ubuntu安装ssh服务端openssh-server 1.背景 2.解决办法 3.测试 1.背景 ubuntu安装后默认只有ssh客户端,只能去连其它ssh服务器: 其它客户端想要连 ...

  7. linux 怎么配置apache,在Linux下配置Apache Web服务

    <在Linux下配置Apache Web服务>由会员分享,可在线阅读,更多相关<在Linux下配置Apache Web服务(10页珍藏版)>请在人人文库网上搜索. 1.在Lin ...

  8. linux下安装配置redis服务

    2019独角兽企业重金招聘Python工程师标准>>> linux下安装配置redis服务 2016年03月25日 15:39:31 coding_everyday 阅读数:3530 ...

  9. grpc 客户端的context 服务端获取不到_MLamp;DEV[10] | gRPC的应用

    上一期和大家谈到了gRPC的快速开始,我么哪知道了gRPC是什么以及怎么快速启动,那么现在,我们来看看这个玩意具体内部是怎么运作的,这里我们同样以helloworld这个为例子来去谈.首先上期内容在这 ...

最新文章

  1. 一个函数打天下,einsum
  2. thymeleaf公共页面元素抽取 || 引入片段的时候传入参数
  3. 利用rfcomm实现树莓派与手机通信_工业物联网 | 怎么用NodeRed实现树莓派与阿里云物联网平台通信?虹科告诉你!...
  4. 基于 Blazor 开发五子棋小游戏
  5. java实现飞机大战游戏
  6. 河南理工大学c语言报告封面,河南理工大学图书信息管理系统设计_纯c语言课程设计.doc...
  7. mysql主从配置错误_mysql主从配置常见错误处理
  8. python如何获取javascript动态产生的数据
  9. eclipse中简便的aptana安装方法
  10. 2018-2019-1 20165309 《信息安全系统设计基础》第一周学习总结
  11. IOS判断用邮箱登录验证是不是合法的方法
  12. matlab密钥生成,使用文件安装密钥安装产品
  13. 凸优化问题,凸二次规划问题QP,凸函数
  14. 金融衍生品软件产品设计必备知识——上海黄金交易所产品概览
  15. 阿里云OSS使用详解(java版本)
  16. 二叉树的构造(前序+中序)---(后序 + 中序)
  17. Mybatis教程之Mybatis配置篇
  18. 可解释性神经网络——1.xNN
  19. 疫后如何激活消费?上海和阿里打了个样板
  20. R第七问 R语言常用数学函数

热门文章

  1. 膜拜下-极致压缩算法成品
  2. Cartographer保存建图轨迹
  3. 深圳达内:用事实打破一切谣言
  4. 移动端自动化python使用appium包登录qq
  5. 联想thinkpad笔记本电源已接通未充电的问题【解决方法】
  6. Masked Language Modeling用于光谱分类模型
  7. 701-简单易懂的进制转换方法
  8. codeforces 400D - Dima and Bacteria
  9. 中债登,中证登,上海清算所区别
  10. PHP编写socket错误信息乱码问题