2014-10-08 18 views
1

當使用TcpClient時,我怎麼知道服務器有或沒有收到?例如,假設我的消息是一個很長的字符串:TcpClient - 如何確定何時傳送字節?

string myAppMessage = "was up too late coding, bla, bla, bla, ....." 
byte[] allBytes = Encoding.ASCII.GetBytes(myAppMessage); 

我想把手上斷了弦,在整體,以TCP,我想知道這整個字符串被送到和接收服務器。

似乎有通過TCP發送數據的一些常用方法:

var client = new TcpClient(IP_ADDR , PORT) 
client.GetStream().Write(allBytes) 

- 或 -

client.Client.Send(allBytes)

是否一方或雙方保證整個消息的傳遞?在第一種情況下,只有在我撥打電話號碼Flush()後才能保證?我認爲上述一個或兩個都阻止了呼叫。如果在沒有拋出異常的情況下完成,我能否認爲這意味着整個郵件已發送/接收?

回答

1

您需要收到另一方的確認。替代品:

  1. 讓遠程方向您發送確認。
  2. 有遠程方Shutdown(Read)的連接。調用Read,直到它返回0. 0表示遠端已關閉並接收到所有數據。
  3. 呼叫關機(寫入)。這等待來自遠程方的確認。

單獨發送不保證發送。

+0

嗨usr - 我不知道如何實施這些建議。你有可以分享的代碼樣本嗎?請注意,除了使用標準TCP之外,我對遠程端沒有影響。 – SFun28 2014-10-08 17:06:29

+0

參見(3)。只有這樣,您才能確保在沒有來自遠程方的合作的情況下收到數據。實際上,您的機器可以等待來自遠程端的確認而不關閉,但是此功能不會被我知道的任何API公開。 – usr 2014-10-08 17:12:30

+0

usr - 你能說更多關於#3嗎?當TCP將字節傳輸到遠程方時,TCP是否收到ACK?似乎極端必須結束連接才能確認之前發送的所有內容都已收到? – SFun28 2014-10-08 21:28:54