在调用socket读写函数read(),write()时,都会有返回值。如果没有正确处理返回值,就可能引入一些问题

总结了以下几点

1当read()或者write()函数返回值大于0时,表示实际从缓冲区读取或者写入的字节数目

2当read()函数返回值为0时,表示对端已经关闭了 socket,这时候也要关闭这个socket,否则会导致socket泄露。netstat命令查看下,如果有closewait状态的socket,就是socket泄露了

当write()函数返回0时,表示当前写缓冲区已满,是正常情况,下次再来写就行了。

3当read()或者write()返回-1时,一般要判断errno

如果errno == EINTR,表示系统当前中断了,直接忽略

如果errno == EAGAIN或者EWOULDBLOCK,非阻塞socket直接忽略;如果是阻塞的socket,一般是读写操作超时了,还未返回。这个超时是指socket的SO_RCVTIMEO与SO_SNDTIMEO两个属性。所以在使用阻塞socket时,不要将超时时间设置的过小。不然返回了-1,你也不知道是socket连接是真的断开了,还是正常的网络抖动。一般情况下,阻塞的socket返回了-1,都需要关闭重新连接。

4.另外,对于非阻塞的connect,可能返回-1.这时需要判断errno,如果 errno == EINPROGRESS,表示正在处理中,否则表示连接出错了,需要关闭重连。之后使用select,检测到该socket的可写事件时,要判断getsockopt(c->fd, SOL_SOCKET, SO_ERROR, &err, &errlen),看socket是否出错了。如果err值为0,则表示connect成功;否则也应该关闭重连

5 在使用epoll时,有ET与LT两种模式。ET模式下,socket需要read或者write到返回-1为止。对于非阻塞的socket没有问题,但是如果是阻塞的socket,正如第三条中所说的,只有超时才会返回。所以在ET模式下千万不要使用阻塞的socket。那么LT模式为什么没问题呢?一般情况下,使用LT模式,我们只要调用一次read或者write函数,如果没有读完或者没有写完,下次再来就是了。由于已经返回了可读或者可写事件,所以可以保证调用一次read或者write会正常返回。

转载于:https://www.cnblogs.com/myd620/p/6219994.html

socket读写返回值的处理相关推荐

  1. socket函数返回值分析

    服务端: 1 WSAStartup(版本,本机的最高版本) WSAStartup函数的第一个参数是加载WinSock库的版本,WSAStartup函数的第二个参数中设置使用的WinSock库的版本,当 ...

  2. blocking socket 读写返回 EAGAIN

    非阻塞的 socket 读写操作返回 EAGAIN,表示当前已经读完内核缓冲区或者写满内核缓冲区,需要等待下一次 select/poll/epoll 事件到来时再操作. 对于阻塞的 socket 读写 ...

  3. select()函数返回值及select与socket阻塞的关系及select函数的意义

    1.select()函数返回值 select的返回值与recv函数的返回值十分类似,都分>0,=0,<0三种情况. >0:有事件发生, FD_ISSET(socket, &f ...

  4. socket返回值为0的问题

    一.问题描述 socket_id为0,1,2的是给标准输入输出用的.当调用socket()来创建套接字时,返回值确实0,这时候如果进行读写,就是直接打印到控制台了. 二.什么情况下socket返回值为 ...

  5. php 获取返回值,求助 如何获取php socket 返回值

    使用抓包工具可以看到,就是页面获取不到返回值,怎么办?? function Send_socket_connect($service_port, $address, $in) { header(&qu ...

  6. scanf返回值_IO FILE之任意读写和scanf的限制绕过

    本文将简单介绍一下scanf的长度绕过和由fwrite.fread实现的任意读写,然后用两个ctf例题(2018年的两道国赛题 echo_back 和 magic)来加深理解.本文中write_s,w ...

  7. epoll socket 服务端中read和write的返回值讨论

    2019独角兽企业重金招聘Python工程师标准>>> 先贴一段代码,代码很简单要看过epoll如何使用,都应该能看懂. 这是服务端程序: #include <sys/sock ...

  8. linux tcp socket 接收的字节数与发送的字节数不符,TCP发送接口(如send(),write()等)的返回值与成功发送到接收端的数据量无直接关系...

    1. TCP发送接口:send() TCP发送数据的接口有send,write,sendmsg.在系统内核中这些函数有一个统一的入口,即sock_sendmsg().由于TCP是可靠传输,所以对TCP ...

  9. linux recv 返回值与linux socket 错误分析

    转载:http://blog.csdn.net/henry115/article/details/7054603 recv函数 int recv( SOCKET s, char FAR *buf, i ...

最新文章

  1. php mysql source_Mysql数据库导入命令Source详解
  2. 马斯克欢庆特斯拉年交付50万辆!国产三雄创新高,逼近其1/5
  3. 设计模式-创建型-单件
  4. C++大学教程(第九版)2016-07 保罗·戴特尔 (Paul Deitel)、 哈维·戴特尔 (Harvey Deitel)_cafbe(C++中文版)
  5. php 标题去重复思想,WordPress网站发布文章时如何防止发布重复标题的文章?
  6. Qt工作笔记-使用信号与槽让两个界面进行数据通信
  7. 请问android直接post请求登录地址成功后,webview还是现实登录界面
  8. 中国气象局所有城市代码
  9. 实验室检测专用计算机的维护保养,计算机实验室维护与管理.doc
  10. 第1节 虚拟机及常用系统配置步骤
  11. JS 实现列表移动(JQuery实现)
  12. 2021年中国研究生数学建模竞赛A题(华为公司命题)——相关矩阵组的低复杂度计算和存储建模
  13. 深度学习中的batch、epoch、iteration
  14. 谁说程序员过了35岁之后就要去“送外卖”、“跑滴滴”?这几种发展走向照样解除焦虑
  15. 米的换算单位和公式_一米等于多少分米(常见的长度单位换算公式方法)
  16. Android 解决打包时提示65536问题
  17. cad有没有网页版_在线CAD看图网页版,一样可以快速查看CAD图纸
  18. 空洞卷积原理详解及其pytorch代码实现
  19. Qt 事件机制,底层实现原理
  20. 易安卓读取HTML,易安卓(E4A)怎么保存设置?

热门文章

  1. 2022年天干地支对照表,java实现
  2. 计算机应用基础二作业,计算机应用基础(二)作业2 (精选可编辑)
  3. Could not load file or assembly ‘NPOI.OOXML, Version=2.5.5.0, Culture=neutral, PublicKeyToken=0df73e
  4. OpenCV玩九宫格数独(零)——预告篇
  5. 艾司博讯:拼多多商家入驻条件和入驻程序
  6. Unity官方代言角色Unity Chan(Unity娘/优妮蒂/ユニティちゃん)模型免费下载
  7. Ext4 超级块详解
  8. Linguistic Sorting and Matching
  9. 【成电860考研】经验贴汇总(专业课部分)-扒遍所有网站:信软群、王道、知乎、csdn等,截止21年7月整理出的所有帖子-共15篇
  10. 详解上海交大819考研