2013-03-30 57 views
0

我有一臺服務器,它爲每個客戶端創建一個線程。這是線程函數,我的程序等待數據發送。如果5秒內沒有數據發送,我需要以某種方式關閉此線程。我嘗試了這種信號/報警組合,並以某種方式工作,但其餘線程函數繼續打印錯誤,因爲sClient(套接字)已關閉。我怎樣才能做這項工作,或者其他解決方案?在recv中等待數據時關閉線程

void time_out() { 
    char r = "-1"; 
    printf("Time out"); 
    send(sClient, &r, 10, 0); 
    close(sClient); 
} 

void* thread(void *arg) { 
    sClient = (int)arg; 
    int size; 

    char* buffer = (char*)malloc(300); 

    signal(SIGALRM, time_out); 
    alarm(5); 

    if (recv(sClient, (char*)&size, sizeof(int), 0) < 0) { 
    printf("Error when getting length \n"); 
    } 

.... 
} 
+0

不知道你想要做什麼了,但是那聽起來像是你要打開一個客戶端一個線程,等待5秒鐘,然後關閉它,如果客戶在那段時間內沒有發送數據的話。那是對的嗎? – maditya

+0

是的,它是:)。我該怎麼做 ? – vladCovaliov

+0

你有什麼理由決定使用SIGALRM方法嗎?在接聽電話之前,爲什麼不只是在你的線程中「睡(5)」?是因爲recv塊嗎? – maditya

回答

3

聽起來你應該打開線程,等待5秒鐘,然後檢查sClient的數據。如果沒有數據,則可以立即關閉線程。否則,如果有數據,您可以調用recv來實際獲取數據。

要做到這一點,你可以使用select調用一個超時檢查套接字上的新數據。

(請參閱「socket timeout: It works, but why and how, mainly the select() function?」如何select與超時工作。)