2012-03-21 38 views
4

我只能在select()API中將timeout參數設置爲最多20秒。無論價值我給上面20,選擇()20秒本身後返回... 所以我試圖寫這樣select()用於超時的用法

int timeoutcount = 0; 
    do 
    { 
    FD_ZERO(&fd); 
    FD_SET(sock,&fd); 
    timeout.tv_sec = 20; 
    timeout.tv_usec = 0; 
    rc = select (sock+1,&fd,null,null,&timeout); 
    if(rc ==0) 
    timeoutcount += 20; 
    } 
    while(rc ==0 && timeoutcount <60) 

1分鐘的超時循環請幫我...我會以正確的方式進行嗎? 如果是這樣,選擇返回1後第一次超時..幫助我解決這個問題 注意:我使用它在目標C

+0

你怎麼知道你超時了,而不是'sock'上發生事件? – nos 2012-03-21 07:24:13

+0

@nos當我第一次嘗試時,我將超時設置爲60秒。 20秒後,我在'襪子'上收到了事件,雖然我的網線已拔掉。之後,當我給超時20秒,它正常工作.. – Kesav 2012-03-21 08:19:57

+0

好吧,你需要處理插座事件。不管你的電纜是否拔掉。你可能會得到一個事件,因爲它被拔出,或者在套接字級別超時,這取決於你在做什麼。在以下情況下選擇返回:套接字發生事件,或發生超時。 select()與廣告完全一樣。如果你不處理套接字事件,那麼你在下次調用該套接字時選擇相同的事件。 – nos 2012-03-21 08:47:55

回答

7

超時沒有20秒的選擇最大值 - 其他最有可能在你的套接字上準備讀取的數據)一定是導致select()返回提前。如果你真的只想使用select()作爲睡眠的方式,試試像這樣調用它:

struct timeval tv = {600, 0}; // sleep for ten minutes! 
if (select(0, NULL, NULL, NULL, &tv) < 0) perror("select"); 
+0

我不想使用select作爲睡眠功能。它應該在套接字上等待事件超時。 – Kesav 2012-03-21 08:21:58

+0

只要註冊的套接字上發生事件,select()就會返回,或者如果沒有套接字事件發生,那麼在超時值指示的時間過去之後它將返回。所以,如果你想處理套接字事件並獲得超時,你需要處理事件發生時的套接字事件,然後再次調用select()(具有適當減小的超時值)。 – 2012-03-21 17:44:31

+0

我有一個基本的疑問。即使沒有網絡連接,Select()會返回一些事件嗎? – Kesav 2012-03-21 18:39:43