2012-04-21 27 views
1

我使用blocing套接字和使用多線程的代碼套接字應用程序..我的問題是我想要接收兩個大包..我們知道tcp必須拆分大數據分成多個packet..this的情形:如何確定數據包接收是在C#中使用tcp的第一個數據包的一部分

  1. 我送6 MB文本文件和TCP拆分包爲2個獨立的分組
  2. 同時我發送26 MB視頻文件和TCP也分割成包2個獨立的數據包
  3. 在我的應用程序我recive第一部分的文本文件讓我們說3 mb的6 MB
  4. 然後我收到的視頻讓我們的第一部分說26 MB的是13 MB ..

的問題是,我怎麼知道該文本文件和視頻文件的第一個數據包的第一個數據包不同的數據和應在處理不同的方式。(也許不同的緩衝區?)

對不起我的英文不好..提前

感謝..

這個我的代碼一些部分

ns = client.GetStream();

 while (isListen == true && client.Connected) 
     { 
       while (!ns.DataAvailable) 
       { 
        try 
        { 
         Thread.Sleep(1); 
        } 
        catch (Exception ex) 
        { 
        } 
       } 


       data = new byte[client.ReceiveBufferSize]; 
       //client.Client.Receive(data); 

       int indx = ns.Read(data, 0, data.Length); 

       string message = Encoding.ASCII.GetString(data, 0, indx); 

       if (message == GetEnumDescription(TypeData.Disconnect)) 
       { 
        isListen = false; 
        server.ClientKeluar = objClient; 
        if (ClientDisconnected != null) 
        { 
         ClientDisconnected(objClient); 
        } 
        thisThread.Abort(); 
        Server.kumpulanThread.Remove(thisThread); 
        Server._serverConnections.Remove(this); 
        client.Close(); 
       } 
       else if (message.Contains(GetEnumDescription(TypeData.GetFile))) 
       { 
        //jalankan proses pengambilan data 
       } 
       else if (message.Contains(GetEnumDescription(TypeData.ByteLength))) 
       { 
        string length = message.Substring(6, message.Length - 6); 
        int len = int.Parse(length); 
        expectedLength = client.ReceiveBufferSize = len; 
        data = new byte[len]; 
       } 
       else if (message.Contains(GetEnumDescription(TypeData.Image))) 
       { 
        typeData = "Image"; 
        dat1 = new byte[client.ReceiveBufferSize]; 
        index = 0; 

       } 
       else if (message.Contains(GetEnumDescription(TypeData.Video))) 
       { 
        typeData = "Video"; 
        dat2 = new byte[client.ReceiveBufferSize]; 
        index = 0; 
       } 
       else 
       { 
        if (typeData == "Image") 
        { 
         expectedLength = expectedLength - message.Length; 
         if (expectedLength == 0) 
         { 
          Array.Copy(data, 0, dat1, index, message.Length); 
          if (ImageDelivered != null) 
          { 
           ImageDelivered(dat1); 
          } 
         } 
         else 
         { 
          Array.Copy(data, 0, dat1, index, message.Length); 
          index = message.Length; 
         } 
        } 
        else if (typeData == "Video") 
        { 
         expectedLength = expectedLength - message.Length; 
         if (expectedLength == 0) 
         { 
          Array.Copy(data, 0, dat2, index, message.Length); 
          if (VideoDelivered != null) 
          { 
           VideoDelivered(dat2); 
          } 
         } 
         else 
         { 
          Array.Copy(data, 0, dat2, index, message.Length); 
          index = message.Length; 
         } 
        } 
        else 
        { 
         expectedLength = expectedLength - message.Length; 
         if (expectedLength == 0) 
         { 
          dataToWrite = dataToWrite + message; 
          string text = dataToWrite; 
          if (MessageDelivered != null) 
          { 
           MessageDelivered(text); 
          } 
          dataToWrite = ""; 
         } 
         else 
         { 
          dataToWrite += message; 
         } 
        } 
       } 
     } 

任何人都可以提供示例代碼,所以我可以得到靈感來解決這個問題?

+0

我無法理解這個問題,但假設我這樣做了,也許您可​​以讓應用程序發送一個握手數據包,讓服務器知道該期待什麼。 – lordcheeto 2012-04-21 03:10:09

回答

2

TCP協議負責製作文件片段,然後加入它們。您將收到完整的數據。

+0

你可以給一個示例代碼先生? – 2012-04-21 03:11:06

+0

http://www.codeproject.com/Articles/32633/Sending-Files-using-TCP – Adil 2012-04-21 03:21:51

+1

有沒有例子可以給。使用單一[TcpClient](http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.aspx)的基本原則不會允許您同時發送兩個不同的文件,除非您這樣做手動。如果您手動執行此操作,則無法辨別哪些數據屬於哪個文件。如果您有要求同時發送兩個文件,則需要兩個TcpClient對象。 – 2012-04-21 03:22:52

相關問題