我正在编写一台能够接收和发送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使用的人。谢谢!
答案 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)。