linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)
errno
在unix系统中对大部分系统调用非正常返回时,通常返回值为-1。并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen()。
erron存放一个正整数来保存上次出错的错误值。
对线程而言。每一个线程都有专用的errno变量。不必考虑同步问题。
strerror converts to English (Note: use strerror_r for thread safety)
perror is simplified strerror/fprintf
慢系统调用
指可能永远堵塞而无法返回的系统调用,一般是一些读写的样例,如pipe。终端设备。网络连接,典型的accept(), read(), write(), open(),select(),epoll()等。
适用于慢系统调用的基本规则是:当堵塞于某个慢系统调用的进程捕获到某个信号且对应的信号处理函数返回时,系统调用可能会返回一个EINTR错误,即将errno的值置为该值。
尽管有些内核会对该系统调用重新启动,但从可移植性的角度说,对EINTR处理是必须的。
注意对connect()不能如此处理。(UNP 5.9)
一个信号被信号处理函数响应,在处理过程中,该信号被屏蔽。标准的信号实现没有排队的功能,所以信号可能会被丢失。多个连续的信号来不及处理。
用waidpid()枚举检查不失为一种好的解决方法,见UNP 5.10
关于TOE(TCP offload engine)
本地抓包时一个小细节:
出现checksum incorrect。是由网卡上的TOE引擎造成的。
用TCP/IP协议处理网络流量,要占用大量server资源。为了减轻server的压力,一种称为TCP减负引擎(TCP Offload Engine :TOE)的技术应运而生。
TCP减负引擎一般由软硬两部分组件构成,将传统的TIP/IP协议栈的功能进行延伸,把网络数据流量的处理工作所有转到网卡 上的集成硬件中进行,server仅仅承担TCP/IP控制信息的处理任务。
一般由操作系统的TCP/IP协议栈完毕TCP/UDP/IP校验和的计算工作,在网卡集成TOE的功能会包含计算checksum。
设置Rx Checksum Offload/Tx Checksum Offload为Enable之后,协议栈不再进行校验和的计算,而是由网卡自己完毕。
把网卡的属性改动一下就能够避免checksum incorrect,禁用 Checksum Offload。可修正checksum incorrect。代价是网络性能减少。
这个校验和的问题似乎相应用层的程序没有什么影响。。。(个人感觉)
Socket上的I/O处理
前文(标准I/O小结)提到的标准I/O库是ANSI C定义的一组高级输入输出函数,比起直接使用UNIX的系统I/O更加方便。
然而,标准I/O库没有提供读取文件元数据的方式,也不适合处理socket一类的特殊文件。
不足值(short count)
定义,简而言之,我想处理10个字节,仅仅处理了6个。则不足值是6 。注意不是4
因为内核中套接口的缓冲区大小有限和网络时延的原因,造成read和write实际处理的字节比预期的要少。其它如遇到EOF或从终端读取,也可能遇到不足值
读写磁盘文件时不会出现不足值
处理方式:
UNP 3.9和CSAPP 10.9(RIO) 均给出了解决方法,借鉴之。例如以下代码:
int simon_send(int fd, char* buf, unsigned int n)
{
int left = n;
char *bufptr = buf;
int send_bytes; while (left >= 0)
{
if ((send_bytes = send(fd, bufptr, MAX_BUF_SIZE, 0)) < 0)
{
if (errno == EINTR) //iterrupted by signal , send again
send_bytes = 0;
else
break;
}
else if (!send_bytes) // EOF or socket shutdown by peer
break; left -= send_bytes;
bufptr += send_bytes;
} return n - left;
} int simon_recv(int fd, char* buf, unsigned int n)
{
int left = n;
char *bufptr = buf;
int recv_bytes; while (left >= 0)
{
if ((recv_bytes = recv(fd, bufptr, MAX_BUF_SIZE, 0)) < 0)
{
if (errno == EINTR)
recv_bytes = 0;
else
return -1;
}
else if (!recv_bytes)
break; left -= recv_bytes;
bufptr += recv_bytes;
} return n - left;
}
另,使用带标志MSG_WAITALL的recv也能一定程度上处理。
关于I/O的选择和比較。可见下图(摘自某ppt):
linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)的更多相关文章
- 网络编程学习笔记(二)基于TCP的Socket编程
1.Socket:英文意思插座.两个Java应用程序可以通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket. 2.Socket通常用来实现client-server(客户端 ...
- linux网络编程学习笔记之五 -----并发机制与线程�
进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我仅仅是举几个样例作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省 ...
- linux网络编程学习笔记之四 -----多-threaded服务器
对于使用过程中并发.通过实现更轻量级线程. 每个线程都是一个独立的逻辑流. 主题是CPU在执行调度的最小独立单位,这个过程是资源分配单元.当然,这是在微内核操作系统说.总之,这是唯一的一个操作系统内核 ...
- linux网络编程学习笔记之三 -----多进程并发服务端
首先是fork()函数.移步APUE 8.3. 比較清晰的解释能够參考http://blog.csdn.net/lingdxuyan/article/details/4993883和http://w ...
- java网络编程学习笔记(二):socket详解
1.Socket有多种构造方法,大多数构造方法在构造的时候就指定了连接的主机和端口号.当客户端的构造方法与服务器连接的时候,可能需要等待一段时间,因为需要建立连接.默认情况下,Socket的构造方法会 ...
- 转 网络编程学习笔记一:Socket编程
题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...
- linux基础命令学习笔记(二)
linux基础命令学习笔记(二) 1.kill :终止进程 kill pid (唯一标示一个进程) kill -9 强制终止 kill -15 命令未结束不能终止 # ps aux 查看所有进程 ...
- Linux网络编程学习计划
由于网络编程是很重要的一块,自己这一块也比较欠缺,只知道一些皮毛,从今天开始系统学习<Linux网络编程>一书,全书分为十四个章节: 第一章 概论 P1-16 第二章 UNIX ...
- Linux Shell编程学习笔记——目录(附笔记资源下载)
LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...
随机推荐
- 洛谷—— P1162 填涂颜色
https://www.luogu.org/problem/show?pid=1162 题目描述 由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭 ...
- android开发者要懂得问题答案
我在网上看了一下有些人在博客上提出一些什么android开发者必须懂得问题,可是就是没有答案,所以我就把这些问题拷贝过来了.顺便也把全部的答案加上,为了让很多其它的开发者高速的找到答案,谢谢! 以下的 ...
- StartCoroutine的使用
StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程. 在C#中直接有Thread这个线程,可是在unity中有些元素是不能操作的.这个时候能够使用协程来完毕. 使 ...
- 一起talk C栗子吧(第九回:C语言实例--最大公约数)
各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们.上一回中咱们说的是素数的样例.这一回咱们说的样例是: ...
- nuxt按需引入 element-UI、自定义主题色(终极按需引入)
首先你要知道 nuxt.js怎么引入第三方插件 : 不多BB. 一.按需引入element-UI 第一步:安装 babel-plugin-component: npm install babel-pl ...
- VC error link
错误1:LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main在project-setting-link里找到pro ...
- 【CS Round #43 D】Bad Triplet
[链接]点击打开链接 [题意] 给你n个点m条边的无权无向联通图; 让你找3个点A,B,C 使得A->B=B->C=A->C 这里X->Y表示点X到点Y的最短路长度. [题解] ...
- [D3] Add label text
If we want to add text to a node or a image // Create container for the images const svgNodes = svg ...
- java set转list,数组与list的转换
读zookeeper的源码(zookeeper.java)时发现的,平时没有怎么注意: private final ZKWatchManager watchManager; List<Strin ...
- 常用的织梦dedecms安全设置集合整理
织梦系统用户很多,被发现的漏洞也就相对很多,所以网站安全需要做好,很多所谓的“黑客”都是用工具来扫描入侵,厉害点的人是不屑来黑我们的小网站的,所以在我们不是专业维护人员情况下,做好一般的安全防护就可以 ...