UNIX网络编程:I/O复用:select和poll函数

我们看到TCP客户同时处理两个输入:标准输入和TCP套接字。我们遇到的问题是就在客户阻塞于(标准输入上)fgets调用,服务器进程会被杀死。服务器TCP虽然正确的给客户TCP发送了一个FIN,但是既然客户进程正阻塞于从标准输入读入的过程,它将看不到这个EOF,直到从套接字读时为止(可能额已过了很长时间)。这样的进程需要一种预先告知内核的能力,使得内核一旦发现进程指定的一个或多个I/O条件就绪(也就是说输入已准备好被读入,或者描述符已能承接更多的输出),它就通知进程。这个能力称为I/O复用,是由select和poll这两个函数支持的。

I/O复用典型使用在下列网络应用场合:

当客户处理多个描述符(通常是交互式输入和网络套接字)时,必须使用I/O复用;

如果一个TCP服务器即要处理监听套接字,又要处理已连接套接字,一般使用I/O复用;

一个客户同时处理多个套接字时可能的,不过比较少见;

如果一个服务器即要处理TCP,又要处理UDP,一般就要使用I/O复用。

如果一个服务器要处理多个服务或者多个协议,一般就要使用I/O复用。

I/O复用并非只限于网络编程,许多重要的应用程序也需要使用这项技术。

UNIX下可用的5种I/O模型的基本区别:

1.阻塞式I/O;

2.非阻塞式I/O;

3.I/O复用(select和poll);

4.信号驱动式I/O(SIGIO);

5.异步I/O(POSIX的aio_系列函数)

一个输入操作通常包括两个不同的阶段:

(1)等待数据准备好;

(2)从内核向进城复制数据。

对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待分组到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用进程缓冲区。

1.阻塞式I/O模型

我们在前面所说的I/O模型都是阻塞I/O,即调用recv系统调用,如果没有数据则阻塞等待,当数据到来则将数据从内核空间(套接口缓冲区)拷贝到用户空间(recv函数提供的buf),然后recv返回,进行数据处理。

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/OS/unix/

时间: 2024-09-12 16:29:05

UNIX网络编程:I/O复用:select和poll函数的相关文章

UNIX网络编程:如何使用select函数的TCP和UDP回射服务器程序

服务器程序: #include <sys/wait.h> #include <string.h> #include <string.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <signal.h> #includ

select-调试信息无法打印 unix网络编程

问题描述 调试信息无法打印 unix网络编程 如代码注释信息所示,应该是缓冲区的问题,但是stderr是无缓冲区的,而且也使用了fflush函数,也没用.希望能有人指点指点,谢谢 #include "globle.h" #define port 8082 int main( int argc, char *argv[] ){ fprintf(stderr, "11111111111n");//无法打印 fflush(stdout); int listenfd,soc

UNIX网络编程之旅-配置unp.h头文件环境

最近在学习Unix网络编程(UNP),书中steven在处理网络编程时只用了一个#include "unp.h"  相当有个性并且也很便捷 于是我把第三版的源代码编译实现了这个过程,算是一种个性化的开发环境的搭建吧,顺便把过程记录下来,以便自己以后查阅.   首先去网上找到源代码包unpv.13e.tar.gz 一找一大堆 解压缩到你的某个目录,unpv13e里面大致有这些目录 ├── aclocal.m4 ├── advio ├── bcast ├── config.guess ├─

unix网络编程问题(初学者)

问题描述 unix网络编程问题(初学者) 除了头文件和打印外,我都是照着书敲的,但是结果不对,希望帮我解决,谢谢啦!!!书上的正确结果是一串表示时间的字符 问题:connect error 在建立服务器的连接出错输入:./get_tima 192.168.154.130(ip地址我用ifconfig得到的,我也用127.0.0.1做过一样得不到想要的结果)结果:connect errorread error 出处:unix网络编程 1.2-一个简单的时间获取客户程序 #include#inclu

socket-刚学linux网络编程,有个问题,listen( )函数可以用来监听其他电脑的端口吗?

问题描述 刚学linux网络编程,有个问题,listen( )函数可以用来监听其他电脑的端口吗? 如果可以是不是可以用这样的流程,先socket()创建描述符, 然后再bind()绑定一个IP地址跟端口? 解决方案 实在是没看懂你的需求 解决方案二: listen是侦听本机的端口,只有服务器端才需要这么做,你想监听其他主机,就需要在局域网路由器等上面做流量监控 解决方案三: 可以,基于socket的编程,只要绑定对IP地址就可以了.

Unix网络编程API

1.字节序函数 #include <netinet.h>uint16_t htons(uint16_t host16bitvalue);uint32_t htonl(uint32_t host32bitvalue); 返回:网络字节序值 uint16_t ntohs(uint16_t net16bitvalue);uint32_t ntohl(uint32_t net32bitvalue); 返回:主机字节序值 一个测试本机字节序的程序,可参见见unpv12e:intro/byteorder.

《UNIX网络编程 卷1:套接字联网API(第3版)》——导读

**前言**本书面向的读者是那些希望自己编写的程序能使用称为套接字(socket)的API进行彼此通信的人.有些读者可能已经非常熟悉套接字了,因为这个模型几乎已经成了网络编程的同义词,但有些读者可能仍需要从头开始学习.本书想达到的目标是向大家提供网络编程指导.这些内容不仅适用于专业人士,也适用于初学者:不仅适用于维护已有代码,也适用于开发新的网络应用程序:此外,还适用于那些只是想了解一下自己系统中网络组件的工作原理的人. 书中的所有示例都是在Unix系统上测试通过的真实的.可运行的代码.但是,考

UNIX网络编程:UDP 中的外出接口的确定

已连接UDP套接字还可用来确定用于特定目的地的外出接口.这是由connect函数应用到UDP套接字时的一个副作用造成的:内核选择本地IP地址.这个本地IP地址通过为目的IP地址搜索路由表得到外出接口,然后选用该接口的主IP地址而选定. 注意:getsockname函数调用的位置. #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h>

UNIX网络编程:UDP缺乏流量控制(改进版)

现在我们查看无任何流量控制的UDP对数据报传输的影响.首先我们把dg_cli函数修改为发送固定数目的数据报,并不再从标准输入读.如下,它写2000个1400字节大小的UDP数据报给服务器. 客户端程序cli.c: #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #inc