socket读写返回值的处理
在调用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读写返回值的处理相关推荐
- socket函数返回值分析
服务端: 1 WSAStartup(版本,本机的最高版本) WSAStartup函数的第一个参数是加载WinSock库的版本,WSAStartup函数的第二个参数中设置使用的WinSock库的版本,当 ...
- blocking socket 读写返回 EAGAIN
非阻塞的 socket 读写操作返回 EAGAIN,表示当前已经读完内核缓冲区或者写满内核缓冲区,需要等待下一次 select/poll/epoll 事件到来时再操作. 对于阻塞的 socket 读写 ...
- select()函数返回值及select与socket阻塞的关系及select函数的意义
1.select()函数返回值 select的返回值与recv函数的返回值十分类似,都分>0,=0,<0三种情况. >0:有事件发生, FD_ISSET(socket, &f ...
- socket返回值为0的问题
一.问题描述 socket_id为0,1,2的是给标准输入输出用的.当调用socket()来创建套接字时,返回值确实0,这时候如果进行读写,就是直接打印到控制台了. 二.什么情况下socket返回值为 ...
- php 获取返回值,求助 如何获取php socket 返回值
使用抓包工具可以看到,就是页面获取不到返回值,怎么办?? function Send_socket_connect($service_port, $address, $in) { header(&qu ...
- scanf返回值_IO FILE之任意读写和scanf的限制绕过
本文将简单介绍一下scanf的长度绕过和由fwrite.fread实现的任意读写,然后用两个ctf例题(2018年的两道国赛题 echo_back 和 magic)来加深理解.本文中write_s,w ...
- epoll socket 服务端中read和write的返回值讨论
2019独角兽企业重金招聘Python工程师标准>>> 先贴一段代码,代码很简单要看过epoll如何使用,都应该能看懂. 这是服务端程序: #include <sys/sock ...
- linux tcp socket 接收的字节数与发送的字节数不符,TCP发送接口(如send(),write()等)的返回值与成功发送到接收端的数据量无直接关系...
1. TCP发送接口:send() TCP发送数据的接口有send,write,sendmsg.在系统内核中这些函数有一个统一的入口,即sock_sendmsg().由于TCP是可靠传输,所以对TCP ...
- linux recv 返回值与linux socket 错误分析
转载:http://blog.csdn.net/henry115/article/details/7054603 recv函数 int recv( SOCKET s, char FAR *buf, i ...
最新文章
- php mysql source_Mysql数据库导入命令Source详解
- 马斯克欢庆特斯拉年交付50万辆!国产三雄创新高,逼近其1/5
- 设计模式-创建型-单件
- C++大学教程(第九版)2016-07 保罗·戴特尔 (Paul Deitel)、 哈维·戴特尔 (Harvey Deitel)_cafbe(C++中文版)
- php 标题去重复思想,WordPress网站发布文章时如何防止发布重复标题的文章?
- Qt工作笔记-使用信号与槽让两个界面进行数据通信
- 请问android直接post请求登录地址成功后,webview还是现实登录界面
- 中国气象局所有城市代码
- 实验室检测专用计算机的维护保养,计算机实验室维护与管理.doc
- 第1节 虚拟机及常用系统配置步骤
- JS 实现列表移动(JQuery实现)
- 2021年中国研究生数学建模竞赛A题(华为公司命题)——相关矩阵组的低复杂度计算和存储建模
- 深度学习中的batch、epoch、iteration
- 谁说程序员过了35岁之后就要去“送外卖”、“跑滴滴”?这几种发展走向照样解除焦虑
- 米的换算单位和公式_一米等于多少分米(常见的长度单位换算公式方法)
- Android 解决打包时提示65536问题
- cad有没有网页版_在线CAD看图网页版,一样可以快速查看CAD图纸
- 空洞卷积原理详解及其pytorch代码实现
- Qt 事件机制,底层实现原理
- 易安卓读取HTML,易安卓(E4A)怎么保存设置?
热门文章
- 2022年天干地支对照表,java实现
- 计算机应用基础二作业,计算机应用基础(二)作业2 (精选可编辑)
- Could not load file or assembly ‘NPOI.OOXML, Version=2.5.5.0, Culture=neutral, PublicKeyToken=0df73e
- OpenCV玩九宫格数独(零)——预告篇
- 艾司博讯:拼多多商家入驻条件和入驻程序
- Unity官方代言角色Unity Chan(Unity娘/优妮蒂/ユニティちゃん)模型免费下载
- Ext4 超级块详解
- Linguistic Sorting and Matching
- 【成电860考研】经验贴汇总(专业课部分)-扒遍所有网站:信软群、王道、知乎、csdn等,截止21年7月整理出的所有帖子-共15篇
- 详解上海交大819考研