select的问题

xzgyb 2004-10-12 02:53:40
在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如何用,请教一二,谢谢
...全文
174 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
flaringstar 2004-10-13
  • 打赏
  • 举报
回复
先把你的代码贴出来看看,这样说不清楚的。
xzgyb 2004-10-13
  • 打赏
  • 举报
回复
OK,感谢各位,
单位机器有问题,不能结贴
晚上回家结贴
fixopen 2004-10-13
  • 打赏
  • 举报
回复
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 < result) //sockfd(writefds中的一员)可非阻塞写
{
//process
++processed;
}
if (FD_ISSET(sockfd, &writefds) && processed < result) //sockfd(writefds中的一员)可非阻塞写
{
//process
++processed;
}
//and so on
}
这样你就可以实现服务器单线程对多客户的非阻塞式的通信了

gettext 2004-10-13
  • 打赏
  • 举报
回复
当然client联上后才可写。这个参数是判断写缓冲区有没有满,如果你发给client的数据很少,写缓冲区不可能满,可以不用这个参数。
man select
those in writefds will be watched to see if a write will not block
mydup 2004-10-13
  • 打赏
  • 举报
回复
select的writefds 参数是要被监视的一组fd(或者socket),只要其中有一个fd是可写的,那么select就会立即返回。而对于一个网络连接,下层的协议栈一般都有数据缓存功能,也就是说,在大多数时候,只要你想写,就可以写。所以select会立即返回。并不是你所谓的写缓冲区有内容。
另外,你想干什么?非阻塞写?诚如我前面所说的,写一般就是非阻塞的。
xzgyb 2004-10-13
  • 打赏
  • 举报
回复
实际上我还没写什么代码,因为也不知怎么用
if (FD_ISSET(sockfd, &_writefdRSet))
{
}
我调试时候发现只要客户端连上来后
那么下次循环select就返回
而FD_ISSET(sockfd, &_writefdRSet)
就为TRUE
而且如此反复下去
我主要就是想问那个第三个参数writefds在实际应用中有什么作用,应该怎么用,
我查了一些文章,在用时一般都是监视读缓冲区,
铖邑 2004-10-13
  • 打赏
  • 举报
回复
FD_ISSET(connectfd, writefds)为true表示发送缓冲区是可写的
MiracleNo1 2004-10-13
  • 打赏
  • 举报
回复
知道这个东东,目前还不能活用.
xzgyb 2004-10-12
  • 打赏
  • 举报
回复
呵呵,
谢谢回答
不过我问的不是用的db的select sql
pacman2000 2004-10-12
  • 打赏
  • 举报
回复
这个回答的是什么呀。。。
gordenfl 2004-10-12
  • 打赏
  • 举报
回复
一般不用自带的DB一般用Mysql,这个不懂,看书吧!劝你用Mysql

23,127

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧