none
[vb2005] 請問 socket.shutdown 的使用時機 RRS feed

  • 問題

  • 各位大大好,
    若在 socket 完全沒有建立 connection 之前, 如果用 shutdown , 會有 exception,
    所以小弟是用 isnothing(socket.remoteendpoint) 來做判斷,
    不管是收到遠端斷線(以 receive 0 byte , poll read 來判斷)或自己有 socket error 再去 shutdown , 都沒有 exception,
    但有一次下 shutdown 得到一個 connection reset 的 exception, 遠端並沒有下斷線, 不知道是什麼原因造成,
    請問各位大大在使用 shutdown 前, 需要判斷什麼條件?
    謝謝
    2009年7月16日 上午 03:02

解答

  • 沒有 shutdown 的話, 遠端不會知道斷線, 只能靠 timeout 來判斷,
    有 shutdown 的話, 遠端會 receive 會 return 0 bytes,
     timeout 雖然是必然的機制, 但如果要在正常操作下,
    要讓遠短在最短的時間內知道 socket 斷線, 我都是靠 shutdown,
    所以, 我在本地端要斷線的話, 會下 shutdown,
    讓 receive thread 在結束時把 socket close 並把變數設為 nothing
    2009年7月16日 上午 09:56

所有回覆

  • 請參考線上手冊備註欄的說明。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年7月16日 上午 03:57
  • 以下節錄自備註欄,

    使用連接導向的 Socket 時,一定要在關閉 Socket 之前呼叫 Shutdown 方法。這將確保已連接通訊端上的所有資料在關閉連接前都會加以傳送和接收。

    呼叫 Close 方法來釋放與 Socket 相關的所有 Managed 和 Unmanaged 資源。不要在關閉之後嘗試重複使用 Socket

    how 設為 Send,指定不允許對 Send 的呼叫。如果您正在使用無連接 Socket,則指定 Send 將不會有作用。

    how 設為 Receive,指定不允許對 Receive 的呼叫。這種情形並不會影響較低的通訊協定層。如果您正在使用連接導向通訊協定,而在呼叫 Shutdown 之後,要是有下列任一條件存在,則會結束連接:

    • 資料在輸入的網路緩衝區中等待被接收。

    • 已有更多資料抵達。

    如果您正在使用無連接通訊協定,則會接收資料包並將之排入佇列。然而,如果沒有緩衝區空間可供額外的輸入資料包使用,則將捨棄它們,而且不會有錯誤傳回給寄件人。並不建議您在無連接的 Socket 上使用 Shutdown

    how 設為 Both 以同時暫停上述的傳送和接收作業。



    以下是小弟使用的情形,
    1. 在 shutdown 之後才會 close ,
    2. socket close 後, 把變數設為 nothing , 下次要連線時再 new
    3. how 都用 both
    4. 這個 socket 是 tcp

    按照備註欄逐項去檢查, 還是不知道問題出在哪裡.

    2009年7月16日 上午 04:09
  • 那你的錯誤訊息是啥? 中斷行是哪行?
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年7月16日 上午 07:34
  • 中斷是 socket.shutdown

    exception 只記得是 connection reset , 沒有抄下來
    因為找不到原因, 所以沒辦法重覆產生,

    小弟只是想問一下, 大家在用 socket.shutdown 時,
    除了用 try..catch 以外, 是利用判斷什麼條件來決定是否要下 shutdown,

    謝謝

    2009年7月16日 上午 08:13
  • ... 不用時,要 Close 關閉前 shutdown,不過我比較注重 Close ,沒有 Shutdown 不會耗資源,沒有 Close 會耗資源。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年7月16日 上午 09:04
  • 沒有 shutdown 的話, 遠端不會知道斷線, 只能靠 timeout 來判斷,
    有 shutdown 的話, 遠端會 receive 會 return 0 bytes,
     timeout 雖然是必然的機制, 但如果要在正常操作下,
    要讓遠短在最短的時間內知道 socket 斷線, 我都是靠 shutdown,
    所以, 我在本地端要斷線的話, 會下 shutdown,
    讓 receive thread 在結束時把 socket close 並把變數設為 nothing
    2009年7月16日 上午 09:56