none
data截斷問題 RRS feed

  • 問題

  • 各位好:
          我最近遇到一個怪問題,我在HTC D2上開發一隻socket Server用來接收Client的資料,我的buffer size設定為3000,Client一次傳遞size=2806的data卻會被分成兩次(1460&1346)被接收下來,我想請教各位大大可能的原因。
          我自己有試過清掉buffer,但是還是相同情況。有思考過ㄧ個原因:網路3G速度,因為如果我是直接利用傳輸線進行Debug模式,不會出現被分成兩次傳送的問題,但是封裝成cab裝到手機上執行就會出現被分次傳送的問題。

    附上部份程式碼:
    while (true)
                        {
                            
                            Application.DoEvents();
                            if(exitflag){
                                try
                                {
                                    clientSocket.Close();
                                }catch(Exception e){
                                    //MessageBox.Show(e.Message.ToString());
                                }
                                 break;                          
                            }
                            t++;
    
    
    
                            if (clientSocket.Available > 0)
                            {
                                obj[0] = "Available:" + clientSocket.Available.ToString();
                                textBox1.Invoke(log, obj);
                                try
                                {
                                    byte[] buf = new byte[3000];
                                    size = clientSocket.Receive(buf, 3000, SocketFlags.None);
                                    if (size > 0)
                                    {
                                        rawdatastring = Encoding.ASCII.GetString(buf, 0, size);
    
                                        obj[0] = "取得資料第" + totalNum + "筆";
                                        textBox1.Invoke(log, obj);
    
                                        result = HttpXmlTrans(rawdatastring);
                                        obj[0] = "傳輸結果:" + result;
                                        textBox1.Invoke(log, obj);
                                        obj[0] = "size:" + size.ToString();
                                        textBox1.Invoke(log, obj);
                                        string path = "\\儲存卡\\rawRealdata_" + totalNum + ".txt";
                                        saveFile(path, rawdatastring);
                                        totalNum++;
                                    }
                                }
                                catch (SocketException s)
                                {
                                   // MessageBox.Show(s.Message.ToString());
                                    if (s.NativeErrorCode.Equals(10054))
                                    {
                                        //MessageBox.Show("Still Connected, but the Send would block");
                                        clientSocket.Close();
                                        break;
                                    }
                                    
                                    
                                }
                                catch(ObjectDisposedException)
                                {
                                   // MessageBox.Show(o.Message.ToString());
                                    clientSocket.Close();
                                    break;
                                }
                                catch (Exception)
                                {
                                   // MessageBox.Show(e.Message.ToString());
                                    clientSocket.Close();
                                    break;
                                }
                            } 
    }


    2009年11月4日 上午 02:46

解答

  • HI,

    您可以參考以下的設定加大Packet Size, 不過以下的文件是Windows XP的設定法:
    Windows XP 的 TCP/IP 及 NBT 設定參數(http://support.microsoft.com/kb/314053)
    • 已標示為解答 piyolala 2009年11月10日 上午 09:06
    2009年11月5日 上午 02:42
  • Hi,
    個人有點小建意,有點無關你的問題。

    一般而言,除非特別限定用途的Socket Program,你應該不要去預設資料需要被切割的次數。
    而是需要去把一個完整的傳輸流程handle好。

    假設你的傳輸handle的正確,基本上,你是不需要擔心資料被切成幾包來傳的。
    畢竟網路狀況不是你應該事先去預測的。
    • 已標示為解答 piyolala 2009年11月10日 上午 09:06
    2009年11月9日 上午 02:59

所有回覆

  • HI,

    這一行所指定的3000代表的是接收資料的緩衝區大小, 而不是表示資料傳送的單位大小是3000, 資料傳送的單位大小是由Packet Size定義的:
    size = clientSocket.Receive(buf, 3000, SocketFlags.None);
    2009年11月4日 上午 04:03
  • 謝謝tihs大大指正。
    我後來又辜狗了一下,發現原因也有可能是因為maximum segment size限制,只是我還是不知道該如何避掉這個限制,還是需要高手們替我解答,感謝(跪)
    2009年11月4日 上午 09:25
  • HI,

    您可以參考以下的設定加大Packet Size, 不過以下的文件是Windows XP的設定法:
    Windows XP 的 TCP/IP 及 NBT 設定參數(http://support.microsoft.com/kb/314053)
    • 已標示為解答 piyolala 2009年11月10日 上午 09:06
    2009年11月5日 上午 02:42
  • Hi,
    個人有點小建意,有點無關你的問題。

    一般而言,除非特別限定用途的Socket Program,你應該不要去預設資料需要被切割的次數。
    而是需要去把一個完整的傳輸流程handle好。

    假設你的傳輸handle的正確,基本上,你是不需要擔心資料被切成幾包來傳的。
    畢竟網路狀況不是你應該事先去預測的。
    • 已標示為解答 piyolala 2009年11月10日 上午 09:06
    2009年11月9日 上午 02:59
  • 謝謝tihs跟Lak4CYUT的回覆。
    tihs大大我在HTC D2的機碼中並無找到適合修改的部份,所以就沒有動了。
    我最後的作法是將每一次client送進來的資料全部組合後再一起送到後端server,因為每一次送進來的資料必須被視為一筆。

    2009年11月10日 上午 09:09