找回密码
 注册
关于网站域名变更的通知
查看: 291|回复: 1
打印 上一主题 下一主题

干货四:Linux socket编程示例 4 select函数的使用

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-9-26 13:40 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

' p0 q- t1 ~8 `0 c1.select函数简介
+ K8 o! N& y/ c  F2 r
, o/ T. b- b0 Z/ m) X/ nint select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *erroRFds,struct timeval*timeout);
" Q' U* K# G: L
4 c- Z2 _( {1 Q; g6 S# P8 T当服务器响应多个客户端连接的时候,需要定义一个线程函数,在每一个线程函数里面处理该连接,进行数据的读写,且connect、accept、recv或recvfrom这样的函数都是阻塞的。4 w& c% }3 W: T9 E) y

0 V, r1 v3 N4 G6 A* z" h现在想不用线程函数就实现服务器响应多个客户端的连接,就可以使用select函数,且是非阻塞的,可以查询是哪个客户端的响应。
. L7 P# S  R- `% u5 G5 H, ^3 r! i' A2 ]! A# z; X
参数maxfd是需要监视的最大的文件描述符值+1;
; n, s8 ?" q; |" H# A$ j: k7 U$ }rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集 合及异常文件描述符的集合。
5 }; u' x* l  C1 R2 d% Bstruct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。
1 ]8 h9 x( k# }' i3 C% rfd_set(它比较重要所以先介绍一下)是一组文件描述字(fd)的集合,它用一位来表示一个fd(下面会仔细介绍),对于fd_set类型通过下面四个宏来操作:
+ z5 ~! W1 t% q+ r- o' }/ XFD_ZERO(fd_set *fdset);将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。 ; e7 T- a& d2 L) b+ t( T
FD_SET(fd_set *fdset);用于在文件描述符集合中增加一个新的文件描述符。
$ S  r5 z% D) j" L: Y- |FD_CLR(fd_set *fdset);用于在文件描述符集合中删除一个文件描述符。
) q) y1 Q- Y3 \6 K. R0 }! YFD_ISSET(int fd,fd_set *fdset);用于测试指定的文件描述符是否在该集合中。

7 r4 h( W" c# |2 n% H2.用select实现服务器响应多个客户端的连接。2 l. H* W6 V* C+ x
游客,如果您要查看本帖隐藏内容请回复

8 _4 X# d* k5 {' G5 J, i) G# [9 X
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 02:04 , Processed in 0.171875 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表