无法理解select() - c中write_fds的使用

时间:2011-05-20 14:46:11

标签: c sockets

我正在编写一台能够接收和发送msgs给客户端的服务器。 我正在使用select()来跟踪所有连接的客户端。

select(max_fd+1,&read_fd,&write_fd,NULL,NULL);

我确实理解在select中使用read_fds - 如果某个客户端向我发送数据或尝试连接到服务器,select将被唤醒,read_fd将包含我可以读取数据的所有fd从他们。 但是,我无法理解write_fds的用法:
由于服务器程序中write_fd的更改(因此我认为我不需要使用它),我不知道select和何时会被唤醒。

我将感谢所有澄清write_fd使用的人。谢谢!

4 个答案:

答案 0 :(得分:1)

使用TCP套接字时,发送的任何数据必须存储在套接字缓存中,直到远端确认已收到数据(通过确认数据)。如果您发送的数据比远程端消耗数据的速度快,您最终将填充缓冲区。此时,如果使用阻塞套接字,则发送将阻塞,直到数据可以放入缓冲区。此时,套接字(文件描述符)不可写,并且select将阻塞,直到缓冲区有可用于写入的空间。

答案 1 :(得分:0)

如果您使用非阻塞套接字,写入集将告诉您套接字何时准备好发送更多数据。

答案 2 :(得分:0)

所有这些复杂,令人困惑的套接字业务都在书中非常清楚和完整地解释了:

W上。 Richard Stevens,Bill Fenner和Andrew M. Rudoff, Unix Network Programming, Volume 1: The Sockets Networking API (3rd Edition)

如果您可以在图书馆中找到副本,那么您就可以在您面前获得完整的信息。此外,还会有一些示例代码可能会非常紧密地跟随您尝试理解的代码。

HTH

答案 3 :(得分:0)

很简单,当您向客户发送回复时,可能会出现这种情况 无法接收更多数据(带宽/响应时间等)。

在这种情况下,写操作可能会阻止。

因此,在写入套接字之前,需要检查套接字的“可写性”。

注意如果使用非阻塞套接字,只有在写入操作时收到EAGAIN或EWOULDBLOCK错误时才应使用它,当使用阻塞套接字时,你应该使用它 在发送数据之前,始终确保套接字是可写的(使用write_fds)。