我想使用select
函數來處理不同的文件描述符。程序啓動時,必須按照間隔開始向其他客戶端發送數據包。我的第一個問題是我如何在主while循環中使用計時器而不中斷while循環和select函數的功能?這是因爲我需要在計時器運行時接受用戶輸入。在選擇函數中檢測超時客戶端
第二個問題是,我不知道,如果我現在需要把發射功能我while循環。當程序進入while循環或者我需要在其他地方使用它時,是否需要編寫send函數?
另外,該程序必須檢測還沒有對一個特定的時間文件描述符。如何檢測哪些文件描述符沒有發送任何數據包到服務器?
下面你可以看到,我至今寫的代碼。你能幫我解決嗎? 我還沒有在這裏使用任何計時器。此外,該程序無法檢測哪個文件描述符已超時。
FD_ZERO(&masterfds);
FD_SET(udp_con, &masterfds);
maxfds = udp_con;
while(exit == false)
{ //Do I need to use the send function here?
FD_ZERO(&readfds);
readfds = masterfds;
selectFunc = select(maxfds+1, &readfds, NULL, NULL, &tv);
if(selectFunc < 0)
{
message("error in select");
exit = true;
}
else if(selectFunc == 0)
{ //How can I detect which file descriptor is timed out?
for(i = 0; i <= maxfds; i++)
{
if(FD_ISSET(i, &readfds))
{
//Doesn't work
cout<<"The file descriptor "<<i<<" has timed out"<<endl;
}
}
}
else
{ //The server has received something from a client
for(i = 0; i <= maxfds; i++)
{
}
}
}
謝謝你,但我不知道,因爲我使用的UDP連接,我不使用accept函數得到一個新的文件描述符爲每一個客戶,我是否需要任何文件描述符添加到我的主人的FD名單? 我現在有點困惑。看來,我將要使用的唯一文件描述符是「udp_con」。那是對的嗎? – Amir
我正在使用linux,只是試圖包含頭文件「sys/timerfd.h」,但它找不到任何具有該名稱的頭文件。我怎樣才能在linux中充分利用timerfd? – Amir