当前位置: 技术问答>linux和unix
select的问题
来源: 互联网 发布时间:2015-08-04
本文导语: 在select函数中 int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout) 第二个参数writefds是监视写缓冲区的 但具体有什么用,应该怎么用? 我试过,当有一client端连到server段, select返回,然...
在select函数中
int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
const struct timespec *timeout)
第二个参数writefds是监视写缓冲区的
但具体有什么用,应该怎么用?
我试过,当有一client端连到server段, select返回,然后accept获取连接套接字connectfd,
把连接套接字加到writefds中,然后下一次循环,
select直接返回,并且FD_ISSET(connectfd, writefds)为true
从而导致整个循环反复运行
也就是当有client连接时,写缓区就有数据
不知writefds如何用,请教一二,谢谢
int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
const struct timespec *timeout)
第二个参数writefds是监视写缓冲区的
但具体有什么用,应该怎么用?
我试过,当有一client端连到server段, select返回,然后accept获取连接套接字connectfd,
把连接套接字加到writefds中,然后下一次循环,
select直接返回,并且FD_ISSET(connectfd, writefds)为true
从而导致整个循环反复运行
也就是当有client连接时,写缓区就有数据
不知writefds如何用,请教一二,谢谢
|
select的规范只是说检测write会不会被block,并不表示判断写缓冲区满不满,虽然通常是这样实现的。
一般的网络客户端程序并不需要对要写的文件描述符(也就是你的socket)进行select,原因是就算你发现写要被阻塞,你也惟有(一般情况)等待而已,所以还不如直接send(或write),让它在那儿等着得
了,如果必要的话。
当然,服务器面对大量的客户时会需要select的。如果是面对一个客户,跟客户端的情况是一样的。对于多客户,我举例如下:
//...
//many clientsocket set to writefds
//...
int result = select(n, 0, &writefds, 0, timeout); //wait the clients for any writeable fd
int processed = 0;
if (result == 0) //好像表示超时而没有可非阻塞写的,如果负表示失败
{
}
else
{
if (FD_ISSET(sockfd, &writefds) && processed
一般的网络客户端程序并不需要对要写的文件描述符(也就是你的socket)进行select,原因是就算你发现写要被阻塞,你也惟有(一般情况)等待而已,所以还不如直接send(或write),让它在那儿等着得
了,如果必要的话。
当然,服务器面对大量的客户时会需要select的。如果是面对一个客户,跟客户端的情况是一样的。对于多客户,我举例如下:
//...
//many clientsocket set to writefds
//...
int result = select(n, 0, &writefds, 0, timeout); //wait the clients for any writeable fd
int processed = 0;
if (result == 0) //好像表示超时而没有可非阻塞写的,如果负表示失败
{
}
else
{
if (FD_ISSET(sockfd, &writefds) && processed