我有一個程序,它可以作爲一個簡單的tcp服務器,它將接受和服務多達4個客戶端。我寫了下面的代碼片段來存檔這個目標,更清楚的是,我用一些「魔術數字」替換了一些MACRO。如何在套接字編程中正確拒絕客戶端的連接?
while(1) {
int ret = 0;
///
// sock_ is the listening socket, rset_conn_ only contains sock_
//
if(select(sock_ + 1, &rset_conn_, NULL, NULL, &timeo_) <= 0) {
ret = 0;
}
if(FD_ISSET(sock_, &rset_conn_)) {
ret = 1;
}
///
// because the rule select() clears file descriptor and updates timeout is
// complex, for simplicity, let's reset the sock_ and timeout
//
FD_SET(sock_, &rset_conn_);
timeo_.tv_sec = 0;
timeo_.tv_usec = 500000;
if(! ret) {
continue ;
}
///
// csocks_ is an 4 integer array, used for storing clients' socket
//
for(int i = 0 ; i < 4 ; ++i) {
if((-1 == csocks_[i]) && (-1 != (csocks_[i] = accept(sock_, NULL, NULL)))) {
break ;
}
}
}
現在,當小於4個客戶端連接,這個代碼片斷工作正常,但在第5客戶端連接,你可以看到,它不會在爲循環接受,這會導致此類一個問題:在下面的循環中,而,select()調用總是返回sock_ bit rset_conn_ set ---只是因爲我不接受它!!
我知道我不應該只是忽略它(不接受)在爲循環,但我怎麼能告訴內核處理得當「我不想接受這個客戶,所以沒有告訴我這客戶想再連接我!「?
任何幫助將不勝感激..
更新:
我不能停止調用select()調用,因爲客戶端已連接可能會斷開,然後我的程序將有空間容納新客戶端。我需要保持監聽套接字來接受連接,而不是在達到一點時停止監聽。
「我需要繼續監聽套接字來接受連接」:不,你不知道。您可以輕鬆地在*客戶端*套接字(我認爲您正在執行*無論*)上觸發一次,並在檢測到丟棄時恢復偵聽循環。在我看來,你正試圖手動推出自己的'listen()'。這是一個我不建議重新創建的輪子。 – WhozCraig