socket读写返回值的处理

news/2024/7/9 16:20:08 标签: epoll

在调用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/jiu0821/p/7678132.html


http://www.niftyadmin.cn/n/755613.html

相关文章

【LeetCode】-链表

文章目录前言一、移除链表元素二、设计链表三、反转链表四、两两交换链表中的节点五、删除链表的倒数第N个节点六、链表相交七、环形链表 II前言 初识LeetCode与算法,将在此系列文章里面,记录自己的算法学习经历,前期主要是监督自己学习打卡…

【LeetCode】-哈希表

文章目录前言一、有效的字母异位词二、两个数组的交集三、快乐数四、两数之和五、四数相加 II六、赎金信七、三数之和八、四数之和前言 初识LeetCode与算法,将在此系列文章里面,记录自己的算法学习经历,前期主要是监督自己学习打卡&#xff…

【LeetCode】-字符串

文章目录前言一、反转字符串二、反转字符串 II三、替换空格四、翻转字符串里的单词五、剑指 Offer 58 - II. 左旋转字符串六、实现 strStr()七、重复的子字符串前言 初识LeetCode与算法,将在此系列文章里面,记录自己的算法学习经历,前期主要…

Linux Redis集群搭建与集群客户端实现

硬件环境 本文适用的硬件环境如下 Linux版本:CentOS release 6.7 (Final) Redis版本:3.2.1 Redis已经成功安装,安装路径为/home/idata/yangfan/local/redis-3.2.1。 我们要在单台机器上搭建Redis集群,方式是通过不同的TCP端口启动…

【电子科学系保研】-- 中科大科学岛保研之旅

文章目录中科大夏令营系统填报情况科学岛夏令营情况科学岛7个所面试过程结束中科大夏令营系统填报情况 中科大是我大三阶段做为目标院校的学校,我在填报夏令营系统中填了科学岛分院、信息学院、物理学院,中科大只能录取一个夏令营(除了少数很…

导航,头部,CSS基础

制作自己的导航条。HTML头部元素&#xff1a;<base> 定义了页面链接标签的默认链接地址<style> 定义了HTML文档的样式文件<link> 定义了一个文档和外部资源之间的关系练习样式表&#xff1a;行内样式表内嵌样式表外部样式表分别练习定义三类选择器&#x…

【电子科学系保研】-- 南方科技大学保研之旅

文章目录南科大线下夏令营情况面试情况面试经验结束南科大线下夏令营情况 南科大的线下夏令营有两天&#xff0c;其中对于南科大电气与电子工程学院整体的介绍、以及导师的介绍放在了之前线上进行。 线下夏令营里面的两天中&#xff0c;第一天上午&#xff0c;张院士整体再介…

【转载】最小生成树之Kruskal算法

给定一个无向图&#xff0c;如果它任意两个顶点都联通并且是一棵树&#xff0c;那么我们就称之为生成树(Spanning Tree)。如果是带权值的无向图&#xff0c;那么权值之和最小的生成树&#xff0c;我们就称之为最小生成树(MST, Minimum Spanning Tree)。 我们由最小生成树的定义…