我正在使用 Select 来监视文件描述符中的事件。 在无限循环中,我看到每次重复时都会调用
FD_ZERO
,然后所有文件描述符都附加上 FD_SET
。每次循环开始时都会发生这一切。
while(TRUE)
{
//clear the socket set
FD_ZERO(&readfds);
//add master socket to set
FD_SET(master_socket, &readfds);
max_sd = master_socket;
//add child sockets to set
for ( i = 0 ; i < clients ; i++)
{
//socket descriptor
sd = client_socket[i];
FD_SET( sd , &readfds);
//highest file descriptor number, need it for the select
// function
if(sd > max_sd)
max_sd = sd;
}
//wait for an activity on one of the sockets , timeout is NULL ,
//so wait indefinitely
activity = select( max_sd + 1 , &readfds , NULL , NULL , NULL);
/*
... */
}
我的问题是:我可以在每次循环重复时不使用
FD_SET
做同样的事情吗?我的意思是使用 FD_ZERO
并在循环之前附加 MASTER SOCKET
,如果有新的套接字,我们会收到它并使用 FD_SET
和 FD_CLR
在断开连接时将其删除。我尝试过,但它导致程序只接收一个套接字连接,之后它不再接收连接
我可以在每次循环重复时不使用 FD_SET 的情况下做同样的事情吗
不。
select()
修改 FD 集。您必须在每次select()
之前重置它们。
您可以保存整个集合的副本并重新分配,而不是循环:但是如果选择循环中的操作修改了集合,您必须修改主副本,而不是
select()
正在使用的副本。