我使用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
将其删除。我试过但它导致程序只接收一个套接字连接,之后它不再接收连接
答案 0 :(得分:0)
每次循环重复时,我都可以不使用FD_SET
没有。 select()
修改了FD集。您必须在每个select()
之前重置它们。
您可以保存整个集的副本,只需重新分配,而不是循环:但如果select循环中的操作修改了集,则必须修改主副本,而不是select()
正在使用的副本。