我已經寫了接受新客戶的數據和來自客戶的服務器代碼。但問題在於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