Unix网络编程读书笔记(四)

原创 2016年08月29日 22:21:13

unix下共有5种I/O模型:

  1. 阻塞式I/O
  2. 非阻塞式I/O
  3. I/O复用(select和poll)
  4. 信号驱动式I/O(SIGIO)
  5. 异步I/O(POSIX的aio_系列函数)

同步I/O与异步I/O:

  1. 同步I/O操作导致请求进程阻塞,直到I/O操作完成。前4种模型都是同步I/O模型,因为其中真正的I/O操作将阻塞进程。
  2. 异步I/O操作不导致请求进程阻塞。

select函数读就绪条件:

  1. 该套接字接收缓冲区中的数据字节数大于等于套接字接收缓冲区低水位标记的当前大小。对上述套接字执行读操作不会阻塞并将返回一个大于0的值。
  2. 该连接读半部关闭(也就是接收了FIN的TCP连接)。对这样的套接字的读操作将不阻塞并返回0(也就是返回EOF)。
  3. 该套接字是一个监听套接字并且已完成连接数不为0。
  4. 其上有一个套接字错误待处理。

select函数写就绪条件:

  1. 该套接字发送缓冲区中的可用空间字节数大于等于套接字发送缓冲区低水位标记的当前大小,并且或者该套接字已连接,或该套接字不需要连接(例如UDP套接字)。
  2. 该连接的写半部关闭。对这样的套接字的写操作将产生SIGPIPE信号。
  3. 使用非阻塞式connect的套接字已经建立连接,或者connect已经以失败返回。
  4. 其上有一个套接字错误待处理。

当某个套接字上发生错误时,它将由select标记为既可读又可写。

这里要对读写操作的一些特点进行总结:

  FIN RST
对这样的套接字的读操作将不阻塞并返回0(也就是返回EOF) 从已经接收到RST的套接字中读取数据,函数将返回ECONNRESET(“connection reset by peer”,对方复位连接错误)。
向已经接收到FIN的套接字中写入数据,不会引发问题,但会引发对端发送RST 向接收到RST的套接字中写入数据,内核会向进程发送SIGPIPE信号,并使进程终止。

在批量方式下,标准输入中的EOF并不意味着我们同时也完成了从套接字的读入;可能仍有请求在去往服务器的路上,或者仍有应答在返回客户的路上。

对于上述问题的解决方法是关闭TCP连接其中的一半。

终止网络连接的通常方法是调用close函数。不过close有两个限制,却可以使用shutdown来避免。

  1. close把描述符引用计数减1,直到为0时才关闭套接字。但shutdown可以直接激发TCP的正常终止序列。
  2. close终止读和写两个方向的数据传送。

函数原型如下:

#include <sys/socket.h>
extern int shutdown (int __fd, int __how) __THROW;

__how有以下三种情况:

  1. SHUT_RD,关闭连接的读一半。对一个TCP套接字调用shutdown函数后,由该套接字接收的来自对端的任何数据都被确认,并悄悄丢弃。
  2. SHUT_WR,关闭连接的写一半。激发正常终止序列。
  3. SHUT_RDWR,连接的读半部和写半部都关闭。

这里先给大家总结select与poll函数的第一个区别,也是我自己总结的。

select函数在使用时通过fd_set类型的数据对其中等待的描述符进行记录,但对这一结构并不是直接对应于每一个描述符,我们还需要专门的函数对这一类型进行操作,因此在使用select函数时还需要使用一个专门的数组用于记录相应的描述符。

但poll函数通过struct pollfd对等待的描述符进行记录,这一结构的第一个字段直接记录了这一描述符,因此不再需要一个专门的数组用于存放描述符。


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

UNIX环境高级编程-读书笔记-网络编程(四)

网络通信 总结:1.不管是UDP还是TCP通信,基本的过程都是,首先建立链接,然后发送消息,然后对方接受消息。 2.网络通信的模式,的书写方法都是固定的,不管是UDP还是TCP。写法固定。 3.网...

UNIX 网络编程 卷一:套接字联网API(第3版) 读书笔记(5) 第五章 TCP客户/服务器程序示例

一、POSIX信号处理二、处理SIGCHLD信号三、wait和waitpid函数四、SIGPIPE信号  
  • sky1737
  • sky1737
  • 2011年03月28日 22:16
  • 520

unix网络编程---读书笔记(一)---tcp/udp/sctp简介

本博客为系列博客,主要记录 《UNIX网络编程 卷一》相关读书笔记; 此篇博客主要针对 第一部分 :简介和 TCP/IP 进行网络编程,首先要确认网络通信协议(protocol);Unix网络编...
  • lx1607
  • lx1607
  • 2016年05月01日 15:51
  • 3750

UNIX网络编程卷2进程间通信读书笔记-管道

一.管道        管道的名称很形象,它就像是一个水管,我们从一端到水然后水从令一端流出。不同的是这里说的管道的两边都是进程。从一端往管道里写数据,其它进程可以从管道的另一端的把数据读出,从而实...

UNIX 网络编程 卷一:套接字联网API(第3版) 读书笔记(1) 第一章 简介

一、OSI模型和网际协议簇中的各层二、网络拓扑的发现1、netstat -i 提供网络接口的信息。我们还提供指定-n标志以输出数值地址其中环回(loopback)接口称为lo,以太网接口称为eth02...
  • sky1737
  • sky1737
  • 2011年03月28日 12:03
  • 463

《UNIX网络编程——Socket Networking API》(3rd,Vol1)读书笔记(1)【第一章】

《Uni网络编程—Socket Networking API》 读书笔记 UNIX® Network Programming Volume 1, Third Edition: The Sockets ...

linux进程间/线程间通讯(《unix网络编程-进程间通讯》读书笔记)

Linux进程间通信 1.管道 管道的主要局限性正体现在它的特点上:     只支持单向数据流;     只能用于具有亲缘关系的进程之间;     没有名字;     管道的缓冲区是有限的(管道制...
  • sunny04
  • sunny04
  • 2014年01月10日 15:12
  • 1235

《UNIX网络编程卷1》读书笔记--第六章I/O复用:select和poll函数

前言I/O复用采用轮询的方式处理多个描述符,当有文件准备好时,就通知进程。 关注点 I/O复用的应用场合 采用I/O复用的客户端和服务器程序 I/O复用的应用场合1. 当客户处理多个描述符时(通常是交...

Unix网络编程上卷读书笔记--源代码的使用和第一章

毋庸置疑,W.RICHARD STEVENS是个计算机领域极少数的天才!他的书,每一本都是经典。  读计算机的书,最好的方法是一个人呆在安静的房间,抱着电脑,一遍看书,一遍敲源代码,推敲源代码。 ...

《UNIX网络编程卷1》读书笔记--第五章TCP客户/服务实例

前言 本章开始编写一个完整的TCP客户/服务器程序实例。 (1) 客户冲标准输入读入一行文本,并写给服务器 (2)服务器从网络输入读入这行文本,并回射给客户 (3)客户从网络读入这行回射...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unix网络编程读书笔记(四)
举报原因:
原因补充:

(最多只允许输入30个字)