2011-07-06 65 views
2

我想確定一個服務器套接字是否正常關閉或不在python中。檢測蟒蛇中套接字的優雅關閉

該程序收到的文件,如果發送過程中發生錯誤應刪除該文件。

我知道你的第一個建議是讓客戶端發送文件的長度或者一些終止數據讓服務器知道文件傳輸完成。
不幸的是,我無法更改客戶端,它只是通過原始tcp轉儲文件,我無能爲力。所以請不要「但如果你可以改變它」或「你的協議有缺陷」,我沒有寫協議,我將不得不處理它。

該腳本應該可以在OSX和Linux上運行,所以epoll已經不在了。

有什麼建議嗎?

我可以補充一點,我不在乎發生什麼錯誤,只是出現任何錯誤。

+0

不會捕捉網絡級異常幫助? – Rahul

+1

通過報告文件結束,可以優雅地關閉套接字。你還需要知道什麼? –

+0

是的,但我怎麼讀... –

回答

0

事實證明,我需要做的就是將套接字超時設置爲較低的值,例如1分鐘,recv調用將在1分鐘後拋出異常。

1

如果另一端已經完成發送數據,它們應該關閉(2)用於寫入的套接字。然後在複用循環中,您將能夠檢查套接字是否已關閉以進行寫入操作或剛剛關閉(由遠程端寫入&讀取)。這是一個正常關機,你可以使用select/poll/kqueue或其他。

如果客戶端不這樣做,不發送終止字符,不發送長度或校驗和它看起來很難。

你應該放棄有關協議的更多細節,客戶端是否打開一個TCP套接字來發送文件?如果傳輸完成,它會關閉套接字嗎?

在最糟糕的情況下,您必須檢查文件的完整性,如果您知道它的格式,可以嘗試在運行時檢查它,或者使用cron選項卡執行清理。如果你不能,那麼很難找到解決方案。祝你好運...

+0

是的,套接字已打開,文件已發送,然後套接字正常關閉。在Java中,您只需關閉輸出流並等待read()返回-1 –

+0

如果出現網絡錯誤或其他情況會發生什麼?我認爲套接字也是封閉的,沒有辦法說它是否優雅地關閉。因此,建議先在套接字上使用WRITING的shutdown()調用來通知對方已完成寫入。有關Java中的正常關閉,請參見http://download.oracle.com/javase/1.4.2/docs/api/java/net/Socket.html#shutdownOutput%28%29。 – Aki