使用select机制处理多连接

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

内容简介:当服务器根据客户端的请求创建多个连接以后,每个连接对应不同的套接字,因为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。


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

查看所有标签

猜你喜欢:

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

机械设计实践

机械设计实践

村洋太郎(日) / 王启义/等 / 机械工业出版社 / 1998-08 / 36.00

本书记述了各种设计过程的思考方法和具体作法以及必要的知识和具 体数据。介绍了设计中要决定的内容和相应的制约条件。如功能、机构、 构造、形状、力和强度、尺寸加工工艺、工具、材料、机械要素等。最后 介绍了具体设计实例。本书的目的在于即使不看其他的书和参考书就能设 计出所需要的具体机械。 本书供从事机械设计的有关技术人员及大专院校相关专业的师生使 用。一起来看看 《机械设计实践》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

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

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具