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网络编程卷2进程间通信读书笔记-管道

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

《UNIX网络编程 卷2》读书笔记(二)

      如何知道进程在一个空消息队列中放入一个消息?如果阻塞在msgrcv调用中,则除了等待无法做其他事情,如果给msgrcv指定非阻塞标志(IPC_NOWAIT),尽管不阻塞了,但必须持续调...
  • phinecos
  • phinecos
  • 2008年05月27日 16:50
  • 458

学习《UNIX网络编程卷一》笔记

学习《UNIX网络编程卷一》笔记
  • zhang_yin_liang
  • zhang_yin_liang
  • 2017年04月11日 16:11
  • 504

UNIX网络编程卷2进程间通信读书笔记—概述

一.什么是进程间通信        IPC是进程间通信的简称,所谓进程通信,就是不同进程之间进行一些"接触",这种接触有简单,也有复杂。机制不同,复杂度也不一样。通信是一个广义上的意义,不仅仅指传递...
  • zxasqwedc
  • zxasqwedc
  • 2014年09月24日 10:47
  • 768

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

1.记录锁的功能        当一个进程正在读或修改文件的某个部分时,它可以阻止其他进程修改同一文件区。我们不应该从字面上去理解记录锁,实际上它应该叫“区域锁”,因为它锁定的只是文件的一个(也可能...
  • zxasqwedc
  • zxasqwedc
  • 2014年09月24日 12:57
  • 565

Unix网络编程学习日记

今天开始拜读《Unix网络编程》。找到的源代码在Linux下有各种问题,最后决定还是自己从头写比较好。 从第一个时间服务程序开始学习。今天先看一下主要的头文件的作用。 在common.h中(参照 ...
  • pdcxs007
  • pdcxs007
  • 2015年02月11日 17:34
  • 2419

unix网络编程(一)第一个例子

刚刚接触本书,遇到第一个例子就有写困难,查阅了很多资料,现总结如下。 1)下载相关代码 unpv13e.tar.gz 2)进行相关编译                解压缩: tar-...
  • Grace_Lee2011
  • Grace_Lee2011
  • 2016年12月27日 09:36
  • 376

unix网络编程 学习笔记(精华)

1.1 客户端程序和服务端程序  网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端.  网络程序是先有服务器程序启动,等待客户端的程序运行并建立连接.一般的...
  • XuLujunCSDN
  • XuLujunCSDN
  • 2017年05月26日 15:33
  • 452

《unix网络编程》(12)五种I/O模型

《unix网络编程》(11)tcp服务器的几种常见状况分析的“服务器进程终止”提到客户阻塞于fgets所以没办法收到服务器发的FIN,只有当客户再次输入文本并发送给服务器后才会从套接字中读取,这时才知...
  • u013074465
  • u013074465
  • 2015年04月04日 21:09
  • 2089

unix网络编程第三版环境配置

根据unp3前沿部分的“如何使用本书”,决定先看本书的第二部分,即第3至11章,这部分偏实践。        当看到确定主机字节序的时候出现了一段程序:#include "unp.h"int ...
  • Trevor211
  • Trevor211
  • 2015年08月23日 16:04
  • 1155
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unix网络编程读书笔记(四)
举报原因:
原因补充:

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