使用select机制处理多连接

栏目: 服务器 · 发布时间: 7年前

内容简介:当服务器根据客户端的请求创建多个连接以后,每个连接对应不同的套接字,因为recv函数默认是阻塞的,会造成在等待一个客户端套接字返回数据的时候整个进程阻塞,而无法连接收其他客户端套接字数据,这时候需要一个可以处理多个连接的方法,socket库提供了两个函数select和poll用来等待一组套接字句柄的读写操作。??select函数是比较常用的,函数定义有新的标准:?

当服务器根据客户端的请求创建多个连接以后,每个连接对应不同的套接字,因为recv函数默认是阻塞的,会造成在等待一个客户端套接字返回数据的时候整个进程阻塞,而无法连接收其他客户端套接字数据,这时候需要一个可以处理多个连接的方法,socket库提供了两个函数select和poll用来等待一组套接字句柄的读写操作。

? Linux 系统提供了select函数和poll函数两个网络套接字描述符。如 程序员 可以通过这两个函数的返回结果,知道那个套接字描述符上有数据处理,使用select函数和poll函数后,程序可以省去不断的伦向网络套接字描述符的步骤。在后台运行网络和poll函数可以显著提高网络应用程序的工作效率。

?select函数是比较常用的,函数定义有新的标准:?

void FD_ZERO(fd_set *fdset);

void FD_SET(int fd, fd_set *fdset);

void FD_CLR(int fd, fd_set *fdset);

int FD_ISSET(int fd, fd_set *fdset);

下面简单介绍一下可读、可写和有异常的定义。

可读的4种定义:(1)套接字缓冲区收到了足够的数据(和TCP的实现有关),也就是说这时调用recv()函数不会阻塞,而且返回一个大于0的值。(2)套接字的读半部被关闭,也就是说它收到了一个FIN标志。此时调用recv()函数返回0。(3)在服务器端套接字成功开始监听,并且完成了至少1个连接。也就是说这时调用 accept ()函数不会阻塞。(4)有一个套接字出错了,这时调用recv()函数则返回-1。

可写的4中定义:(1)套接字的发送缓冲区有足够的空间接收数据此时调用send()函数不会阻塞且返回一个大于0的值。(2)套接字的写半部被关闭。(3)非阻塞的connect()函数成功建立了连接,或者失败。(4)有一个套接字出错了,这时调用send()函数则返回-1。

根据不同的标准,使用select函数需要包含不同的头文件,select函数提供一种fd-

set

机制,fd-set是一组文件句柄的集合,参数n通常取select函数的fd-set中最大的一个文件句柄加1,参数readfds是要监控的读文件句柄集合,当readfds或者writefds有数据或者时间超时,select函数返回大于0的值,用户可以判断哪个套接字句柄返回数据,如果函数返回0表示超时,出错返回-1.需要注意的是,在每次调用完select函数后,需要重新设置fd-set。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

深入理解Java虚拟机(第2版)

深入理解Java虚拟机(第2版)

周志明 / 机械工业出版社 / 2013-9-1 / 79.00元

《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》内容简介:第1版两年内印刷近10次,4家网上书店的评论近4?000条,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体版在台湾也十分受欢迎。第2版在第1版的基础上做了很大的改进:根据最新的JDK 1.7对全书内容进行了全面的升级和补充;增加了大量处理各种常见JVM问题的技巧和最佳实践;增加了若干......一起来看看 《深入理解Java虚拟机(第2版)》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器