EDA365电子论坛网
标题:
干货四:Linux socket编程示例 4 select函数的使用
[打印本页]
作者:
ulppknot
时间:
2019-9-26 13:40
标题:
干货四:Linux socket编程示例 4 select函数的使用
" J- v7 S$ x! p4 c) i1 k9 r5 n' j
1.select函数简介
& U1 y8 E, h5 U4 J% J1 W" j' W8 ^
* r+ B* a; k8 j. z
int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval*timeout);
0 ^; }. ?% E: q+ R+ B. w- R
. c0 Z. f0 X! {+ ^
当服务器响应多个客户端连接的时候,需要定义一个线程函数,在每一个线程函数里面处理该连接,进行数据的读写,且connect、accept、recv或recvfrom这样的函数都是阻塞的。
& y5 F: _" x$ g% b# ~
/ T- B# F/ p& n' ^$ S: O7 d. Z
现在想不用线程函数就实现服务器响应多个客户端的连接,就可以使用select函数,且是非阻塞的,可以查询是哪个客户端的响应。
8 E' w. A/ Q v# l- _( t
- i. n! D: }, k
参数maxfd是需要监视的最大的文件描述符值+1;
6 Z ]2 v) Q7 K! B
rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集 合及异常文件描述符的集合。
" Y; K. W: _4 n5 p( Q/ O" K* @* e
struct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。
- o" C1 |6 W2 s' ?2 z
fd_set(它比较重要所以先介绍一下)是一组文件描述字(fd)的集合,它用一位来表示一个fd(下面会仔细介绍),对于fd_set类型通过下面四个宏来操作:
+ ]# I' F( @5 }' Z- B0 b
FD_ZERO(fd_set *fdset);将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。
1 ` b" ^# g) @* ~4 u
FD_SET(fd_set *fdset);用于在文件描述符集合中增加一个新的文件描述符。
3 A3 {2 e4 G, O& Z# k
FD_CLR(fd_set *fdset);用于在文件描述符集合中删除一个文件描述符。
9 ~3 v- C. ~1 r U1 T8 V: i
FD_ISSET(int fd,fd_set *fdset);用于测试指定的文件描述符是否在该集合中。
?+ p, u% O/ c9 m
2.用select实现服务器响应多个客户端的连接。
! v2 c5 a! ^+ y7 n, y
% u# E: n4 J* e7 i/ z
% f% M, @. O. L
作者:
ycbth
时间:
2019-9-26 15:21
看看
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2