2015-07-20 48 views
0

我有一個TCPServer運行文件接收,它的工作時間爲99%,但它有時(隨機看起來)掛在AcceptSocket()行,即使我等待Pending()標誌爲真。這是我用於服務器的代碼。 (我知道Thread.Sleep()是可悲的,但這不是手頭的問題......我不認爲)。即使有掛起的連接,TCPServer AcceptSocket()掛起

// wait for the file connection 
int elapsed = 0; bool timeout = false; int overtime = 60000; 
while (fileServer.Pending() == false && (elapsed < overtime)) 
{ 
    Thread.Sleep(1000); 
    elapsed += 1000; 

    if (elapsed > overtime) 
     timeout = true; 
} 

    if (timeout) 
    { 
     Program.EventMessage("FILE SERVER TIMEOUT, NO FILE RECIEVED"); 
     incoming_file = false; 
     continue; 
    } 

Program.EventMessage("OPENING SOCKET"); 
fileSocketForClient = fileServer.AcceptSocket(); 

基本上,因爲這種代碼確實工作。什麼會導致掛起AcceptSocket()問題,即使它有掛起的連接?

是否有無論如何檢查,看看是否阻塞我可以實現超時?

我想讓套接字保持阻塞狀態,因爲應用程序的其餘部分確實需要完成這個操作才能繼續前進,它只需要一個超時或其他東西,如果它確實存在,可以恢復而不必手動重新啓動整個程序。

發現問題,我知道我需要做什麼來解決它(超時AcceptSocket()),但圍繞所以我還沒有找到一個可行的方法來做到這一點呢。

作爲一個臨時的創可貼,我把它移到了多線程中,所以至少在它死的時候服務器仍然可以...只會有永遠阻塞的線程來處理。

+2

'Pending'調用不預測未來。 *過去未處理的連接*並不保證連接將在稍後處理。如果您想要不阻塞的套接字操作,請使用不阻塞的套接字操作。 –

+0

但待定呼叫確定它是否具有傳入連接。沒有? – Rapitor

+2

當時它回來了,是的。但這並不能預測未來。之後的連接可能不會處於等待狀態,比如說因爲對方關閉了連接。如果您想要使用非阻塞套接字操作,請使用非阻塞套接字操作。 –

回答

0

連接掛起。這是否意味着一個連接將在稍後處理?編號狀態功能不預測未來。 「我非常聰明地想到套接字操作可能會阻塞的每種​​可能方式,並確保不會發生,所以我可以使用阻塞套接字操作,並且仍然可以確保它們永遠不會阻塞。」不,你不是。別嘗試。它不會工作。使用非阻塞套接字操作。

+0

我很感謝downvoter的解釋。如果我不清楚,我想知道需要澄清的事情。如果我不正確,我想知道如何。 –

+0

大衛,只是建議使用線程,你會從小子得到噸的代表。 –

+0

儘管它確實能夠發現可能發生的事情,但這並不能回答我的問題。 – Rapitor