我已经写了接受新客户的数据和来自客户的服务器代码。但问题在于select并没有等到超时,尽管没有来自客户端的数据。我想等待5秒钟,并为可用客户端发送心跳。但它在第一次迭代中等待5秒钟,然后在下一次迭代中快速发送心跳。如何解决这个问题呢。提前致谢。选择在C++中的插座不等待超时值
void * Communicate(void * id)
{
int *iSockID = (int *) id;
int listener = *iSockID;
fd_set master; // master file descriptor list
fd_set read_fds; // temp file descriptor list for select() read
fd_set write_fds; // temp file descriptor list for select() read
int fdmax; // maximum file descriptor number
int i, j, rv;
FD_ZERO(&master); // clear the master and temp sets
FD_ZERO(&read_fds);
FD_ZERO(&write_fds);
// add the listener to the master set
FD_SET(listener, &master);
printf("Listener is %d \n" , listener);
// keep track of the biggest file descriptor
fdmax = listener; // so far, it's this one
//accept 3 clients
// main loop
for(;;) {
read_fds = master; // copy it
write_fds = master;
struct timeval tv;
tv.tv_sec = 5;
tv.tv_usec = 0;
int iResult = select(fdmax+1, &read_fds, &write_fds, NULL, &tv) ;
if (iResult == -1)
{
perror("select");
exit(4);
}
for(i = 0; i <= fdmax; i++)
{
//send work for clients
SendHeartBeats(write_fds , fdmax , listener , i);
}
// run through the existing connections looking for data to read
// ADD NEW CONNECTIONS READ FROM CONNECTIONS
for(i = 0; i <= fdmax; i++)
{
if (FD_ISSET(i, &read_fds))
{ // we got one!!
// handle new connections
if (i == listener)
{
AcceptNewClients(master , fdmax , listener);
} else
{
AccepeDataFromClients(i , master);
} // END handle data from client
} // END got new incoming connection
} // END looping through file descriptors
sleep(3);
} // END for(;;)
return 0;
}
我不能没有看到SendHeartBeats'的'的实施提供了更详细的解答。 – jxh