当前位置: 技术问答>linux和unix
关于select()函数的用法
来源: 互联网 发布时间:2014-12-04
本文导语: int select(int n,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,sturct timeval* timeout) 我还是不太明白这个函数的使用场合,最好谁给我讲讲。 根据我的理解,我现在想用这个函数实现如下功能: 客户建立一个套接字fd,和...
int select(int n,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,sturct timeval* timeout)
我还是不太明白这个函数的使用场合,最好谁给我讲讲。
根据我的理解,我现在想用这个函数实现如下功能:
客户建立一个套接字fd,和服务器建立一个连接,然后客户
可能在这个套接字上接收服务器发来的指令,也可能客户向
服务器主动报告状态。
我现在想在主循环中,将fd加入readfds和writefds,然后调用select(...),
当服务器发命令后,可以用FD_ISSET(fd,readfds)判断到有数据接收,当客户向服务器主动报告时,可以用FD_ISSET(fd,writefds)判断有数据要发送,不知道这样可不可以?如果可以,怎么才能让FD_ISSET(fd,writefds)判断为真呢?
我还是不太明白这个函数的使用场合,最好谁给我讲讲。
根据我的理解,我现在想用这个函数实现如下功能:
客户建立一个套接字fd,和服务器建立一个连接,然后客户
可能在这个套接字上接收服务器发来的指令,也可能客户向
服务器主动报告状态。
我现在想在主循环中,将fd加入readfds和writefds,然后调用select(...),
当服务器发命令后,可以用FD_ISSET(fd,readfds)判断到有数据接收,当客户向服务器主动报告时,可以用FD_ISSET(fd,writefds)判断有数据要发送,不知道这样可不可以?如果可以,怎么才能让FD_ISSET(fd,writefds)判断为真呢?
|
select 返回大于0的值以后(等于0表示超时,小于0表示错误)
就应该用FD_ISSET测试描述符。
如果只是为了检测一个fd,用select没有什么意义,
writefds一般用处不大,只要发送缓冲区有空间就返回,表示可以写,问题是阻塞模式的时候,要发送的数据量比发送缓冲区空余空间大,写的时候照样阻塞。
就应该用FD_ISSET测试描述符。
如果只是为了检测一个fd,用select没有什么意义,
writefds一般用处不大,只要发送缓冲区有空间就返回,表示可以写,问题是阻塞模式的时候,要发送的数据量比发送缓冲区空余空间大,写的时候照样阻塞。