2012-04-21 13 views
1

私はコードソケットアプリケーションblocingソケットを使用してマルチスレッドを使用しています..私の問題は、私は2つの大きなパケットを受信したいです..私たちは、複数packet..thisへの大規模なデータシナリオ:どのようにパケットが受信することを決定する最初のパケットの一部ですC#

  1. 私は、同時に2つの別々のパケット
  2. に6メガバイトのテキストファイルとTCP分割パケットを送信する私は26メガバイトのビデオファイルやTCPを送っても、分割パケットに2別パケット
  3. 私のアプリケーションでは、テキストファイルの最初の部分を受け取ります。3 mbの6 MB
  4. その後、私は、ビデオの最初の部分を受け取るには、質問は、私はビデオファイルのテキストファイルと最初のパケットの最初のパケットが異なるデータであることを知っているべきかである26メガバイトの13メガバイト...

それを言うてみましょう.. ..別の方法で事前に

感謝..

を私の悪い英語のための

申し訳ありません(多分別のバッファを??)を扱うこの私のコードの一部

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

答えて

2

TCPプロトコルは、ファイルのセグメントを作成して後でそれらを結合することに注意します。あなたは受信で完全なデータを取得します。

+0

サンプルコードを教えていただけますか? –

+0

http://www.codeproject.com/Articles/32633/Sending-Files-using-TCP – Adil

+1

付与する例はありません。単一の[TcpClient](http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.aspx)を使うことの基本は、そうしない限り、2つの異なるファイルを同時に送信することはできません手動でそれを手動で行うと、どのデータがどのファイルであるかを識別する方法がありません。 2つのファイルを同時に送信する必要がある場合は、2つのTcpClientオブジェクトが必要です。 –

関連する問題