none
TCP 接收 9876 bytes 分成 1460 與 8146 接收 RRS feed

  • 問題

  • 各位前輩好:

    目前利用微控制器透過TCP傳輸到VB.net,發現VB.net 會將總資料 9876bytes 分成 1460 與 8146 ; 兩段接收

    為了驗證是微處理器的問題還是VB.net的問題 , 我利用 " TCP與UDP工具" 來代替VB.net 發現 " TCP與UDP工具"可以一次收9876bytes


    VB.net 程式

           Dim myReceiveBytes(9876) As Byte

            While (True)      '一直監聽訊息
                Try
                    InBytesCount = myNetworkStream.Read(myReceiveBytes, 0, myReceiveBytes.Length)    '接收端
                    System.Threading.Thread.Sleep(100) '在指定的時間內暫止目前的執行緒,單位毫秒

                    If InBytesCount = 0 Then
                        Exit While
                    End If

                    Name_s = InBytesCount.ToString   ' 利用 InBytesCount 來觀看 每次收的bytes 數目
                    ADD_DataGridView1(Name_s, Date_s, Time_s, Data_s) '因不同執行序,所以利用 委派 來執行
                Catch ex As Exception
                    MessageBox.Show(ex.ToString)
                    Exit Sub
                End Try

            End While

    ======================== 我是分隔線 ==================================

    我查了資料發現 VB TCP<sentencetext xmlns="http://www.w3.org/1999/xhtml">接收緩衝區的大小,以位元組為單位。</sentencetext><sentencetext xmlns="http://www.w3.org/1999/xhtml"> 預設值為 8192 位元組。</sentencetext>

    <sentencetext xmlns="http://www.w3.org/1999/xhtml">但我把它增大,也是分 1460 與 8416 接收 ,我想問可以 一次收 9876 bytes嗎?</sentencetext>

    <sentencetext xmlns="http://www.w3.org/1999/xhtml">想請前輩們給我一點建議</sentencetext>

    感謝

    2018年6月13日 上午 02:32

解答

  • 你可以參考這篇:

    [.Net] 資料接收的常識

    TCP 封包預設 Modem 是 512 bytes ,高速網域是 1500 bytes ,如果網路設備支援巨型封包才會超過 1500 bytes 。

    1500 扣掉 TCP Header 差不多就是 1460 。

    另外,你   If InBytesCount = 0 Then 這段最好改為用逾時判斷,否則要是連續 100ms 沒資料,你就會視為斷線了。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 black_NERO 2018年6月14日 上午 02:26
    2018年6月13日 下午 03:22

所有回覆

  • 那是你接收模式怎麼寫的問題,過長的內容會分段是一定的,畢竟訊息傳遞一定會有前後時間順序的問題。

    我有寫過幾篇部落格,雖然內容是介紹  serialport,但在保持資料完整接收上, serialport 和 socket 道理也差不多,你可以參考看看。

    https://dotblogs.com.tw/billchung/2012/02/03/67624

    https://dotblogs.com.tw/billchung/2012/02/05/67809

    https://dotblogs.com.tw/billchung/2012/02/18/69599


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2018年6月13日 上午 02:53
    版主
  • 你好:

    請問 我該如何判斷TCP接收緩衝區目前的資料大小?  目前想法是等到緩衝區達到 9876 bytes 再一次讀取

    就像 serialport中的

    while (comport.BytesToRead < 1024) { Thread.Sleep(16); }

    VB 中目前是利用 myNetworkStream.Read(myReceiveBytes, 0, myReceiveBytes.Length) 

    最後發現 

    TCP receive buffer, in bytes. The default value is 8192 bytes.

    所以 我還必須設定 TcpClient.ReceiveBufferSize 為 9876 bytes 對吧?

    謝謝

    2018年6月13日 上午 05:27
  • 你可以參考這篇:

    [.Net] 資料接收的常識

    TCP 封包預設 Modem 是 512 bytes ,高速網域是 1500 bytes ,如果網路設備支援巨型封包才會超過 1500 bytes 。

    1500 扣掉 TCP Header 差不多就是 1460 。

    另外,你   If InBytesCount = 0 Then 這段最好改為用逾時判斷,否則要是連續 100ms 沒資料,你就會視為斷線了。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 black_NERO 2018年6月14日 上午 02:26
    2018年6月13日 下午 03:22