2010-03-18 103 views
3

這是一個異步套接字的場景,我不太明白......我有2個Tcp套接字,一個客戶套接字&一個服務器套接字。我的服務器套接字綁定在端口上偵聽&。C#Socket.BeginSend AsyncCallback行爲(超時?)

我的客戶端套接字連接到服務器套接字(使用BeginConnect/EndConnect)。然後,我使用BeginSend()向服務器發送消息。在服務器端,我不做Receive()或BeginReceive()。

什麼情況是,我BeginSend調用指定我的AsyncCallback被調用&其IAsyncResult的告訴我,它完成&調用Socket.EndSend()不會引發任何異常......

有沒有東西,我沒有或者不應該只在BeginSend調用實際發送一些東西給服務器時調用AsyncCallback(即:服務器收到所有字節後調用的回調函數)?如果服務器上沒有接收完成,那麼在sendtimeout到期後我的回調不應該被調用,並且我對Socket.EndSend的調用會引發異常?

謝謝

回答

3

不,TCP/IP處理所有這些給你。連接兩端都有緩衝區,可以保存數據直到可以接收數據。如果沒有緩衝,發送健談通信時可能會有可怕的延遲。

想像它郵寄一封信。它在你的郵箱裏,直到郵件人拿起它。一旦發生,它就會被髮送。尚未收到。它可能正在運送中,或者可能正在等待郵箱中供他們閱讀。

因此,在BeginSend之後獲得回調只會告訴您這是發送的。確定對方接收並處理數據的唯一方法是請求回覆一些確認時間。

+0

等什麼?在從服務器收到TCP ACK之前調用beginsend回調函數?我不確定我喜歡這個。 – Chris 2014-03-01 12:00:51