我有一個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()
),但圍繞所以我還沒有找到一個可行的方法來做到這一點呢。
作爲一個臨時的創可貼,我把它移到了多線程中,所以至少在它死的時候服務器仍然可以...只會有永遠阻塞的線程來處理。
'Pending'調用不預測未來。 *過去未處理的連接*並不保證連接將在稍後處理。如果您想要不阻塞的套接字操作,請使用不阻塞的套接字操作。 –
但待定呼叫確定它是否具有傳入連接。沒有? – Rapitor
當時它回來了,是的。但這並不能預測未來。之後的連接可能不會處於等待狀態,比如說因爲對方關閉了連接。如果您想要使用非阻塞套接字操作,請使用非阻塞套接字操作。 –