select函数中第三个参数:writefds,大家是怎么理解和应用?

VampireQQ 2002-10-12 06:39:38
在常用的服务器/客户机的模型中,服务器端使用select,客户端连接到服务器,服务器就分配一个socket fd,所有的数据读写都通过这个socket fd,一旦客户端使用send等函数发送消息,服务器端的fd_isset就会成立接下来就是服务器端的处理消息的函数了,但是服务器端要往客户端发送信息的话,我会使用send等函数,这个时候我怎么样监测writefds呢?请大家指点。
...全文
1009 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
everwindforce 2002-11-03
  • 打赏
  • 举报
回复
The select Model
The select model is the most widely available I/O model in Winsock. We call it the select model because it centers on using the select function to manage I/O. The design of this model originated on Unix-based computers featuring Berkeley socket implementations. The select model was incorporated into Winsock 1.1 to allow applications that want to avoid blocking on socket calls the ability to manage multiple sockets in an organized manner. Because Winsock 1.1 is backward-compatible with Berkeley socket implementations, a Berkeley socket application that uses the select function should technically be able to run without modification.

The select function can be used to determine whether there is data on a socket and whether a socket can be written to. The whole reason for having this function is to prevent your application from blocking on an I/O bound call such as send or recv when a socket is in a blocking mode and to prevent the WSAEWOULDBLOCK error when a socket is in nonblocking mode. The select function blocks for I/O operations until the conditions specified as parameters are met. The function prototype for select is as follows:

int select(
int nfds,
fd_set FAR * readfds,
fd_set FAR * writefds,
fd_set FAR * exceptfds,
const struct timeval FAR * timeout
);




The first parameter, nfds, is ignored and is included only for compatibility with Berkeley socket applications. You'll notice that there are three fd_set parameters: one for checking readability (readfds), one for writability (writefds), and one for out-of-band data (exceptfds). Essentially, the fd_set data type represents a collection of sockets. The readfds set identifies sockets that meet one of the following conditions:


Data is available for reading.


Connection has been closed, reset, or terminated.


If listen has been called and a connection is pending, the accept function will succeed.

The writefds set identifies sockets in which one of the following is true:


Data can be sent.


If a nonblocking connect call is being processed, the connection has succeeded.

Finally, the exceptfds set identifies sockets in which one of the following is true:


If a nonblocking connect call is being processed, the connection attempt failed.


Out-of-band (OOB) data is available for reading.

maoyujian 2002-11-01
  • 打赏
  • 举报
回复
监测writefds是这个套接字可写是返回还是正在发送数据是返回?
gongdath 2002-10-13
  • 打赏
  • 举报
回复 1
select函数在writefds变为可写时返回.
VampireQQ 2002-10-13
  • 打赏
  • 举报
回复
up
whydoyoucare 2002-10-13
  • 打赏
  • 举报
回复
《windows网络编程技术》第八章内容:
只有在三种条件下,才会发出F D _ W R I T E通知:
■ 使用c o n n e c t或W S A C o n n e c t,一个套接字首次建立了连接。
■ 使用a c c e p t或W S A A c c e p t,套接字被接受以后。
■ 若s e n d、W S A S e n d、s e n d t o或W S A S e n d To操作失败,返回了W S A E W O U L D B L O C K错
误,而且缓冲区的空间变得可用
因此,作为一个应用程序,自收到首条F D _ W R I T E消息开始,便应认为自己必然能在一个套接字上发出数据,直至一个s e n d、W S A S e n d、s e n d t o或W S A S e n d To返回套接字错误
W S A E W O U L D B L O C K。经过了这样的失败以后,要再用另一条F D _ W R I T E通知应用程序再次发送数据。
VampireQQ 2002-10-12
  • 打赏
  • 举报
回复
其实就是究竟在什么时候,场合使用writefds?

4,387

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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