2012-07-30 99 views
0

我必須實現一個應用程序,它在很短的時間內每隔幾秒向服務器發送一次數據包,當服務器收到它時,它會向客戶端發送一個響應,然後纔會發送另一個數據包。這聽起來很不錯,但是我們使用的是TCP,服務器收到數據包後就立即響應,而不是後處理或類似的東西。所以這讓我想知道,你爲什麼要這樣做?客戶端有一個隊列,我不停的所有數據包,並做了這樣的事情:驗證是否需要TCP?

try { 
    send packet // exception is thrown if connection is lost 
    remove packet from queue 
} catch exception { 
    try to reconnect 
} 

所以在這種情況下,數據包被從隊列中刪除僅當發送成功。

對此有何想法?這是最佳做法嗎?如果有人能爲我解決這個問題,我將不勝感激。

謝謝

+0

問:你的問題是什麼? 「開火併忘記」(而不是保持隊列)會更好嗎?答:很可能。使用UDP而不是TCP會更好嗎(只要我們保持隊列並可能管理重試)?答:很可能。檢測「發送」錯誤(沒有某種「ACK」)會有問題嗎?答:是的。任何這些(潛在)問題的答案是:「這取決於」。 ;)恕我直言... – paulsm4 2012-07-30 18:48:48

+0

TCP保證運輸和訂購。所以對於UDP你可能會失去排序,你將不得不自己重新發送和重新排序和分片。 – 2012-07-30 18:50:40

+0

如果您只需要知道連接已啓動,就會出現一個名爲TCP_KEEPALIVE的選項,它會發送數據包以保持連接處於活動狀態,如果它們丟失,則會將其保留。這自然不會保證軟件在另一端正在工作,只是TCP連接還活着。 – 2012-07-30 18:52:33

回答

1

發送是不夠的在某些情況下。如果絕對重要的是必須收到你推出門的數據,那麼你應該等待確認該數據包是由遠程端接收/處理的。

即使網絡級別的東西完美工作並且數據包到達目的地,該目標機器仍然可能會崩潰或丟失數據。如果你刪除了發送,那麼這些數據就沒有了。等待來自遠端的確認至少會讓您重新發送已損壞/丟失的數據包。

+0

您是否認爲服務器可能會崩潰並且連接保持活動狀態?也許如果它以某種方式被保存在一個線程中? – Bogdan 2012-07-30 18:57:14

+0

該軟件可能會失敗並且不會死亡。例如它可能會死鎖 – 2012-07-30 18:57:55

+0

你說得很對。我從一個非常天真的角度來看待這個問題。感謝您的洞察力。 – Bogdan 2012-07-30 19:00:32

1

一種選擇是將數據包放入隊列併發送。發送後將它們移動到「待處理」隊列中。一旦另一端有加工他們,你標記他們已完成。然後你遇到了其他問題。如果另一端處理它們,但是這種反應永遠不會達到你的目的呢?這是一個相對研究的問題,如果您需要確定,我建議您研究分佈式事務和兩階段提交。

+0

這是一個美妙的想法。謝謝 :) – Bogdan 2012-07-30 18:52:58