2015-10-25 10 views
1
.

. Пожалуйста, помогите мне понять, почему при отправке по сети числа байт-преобразованного массива байтов первый кадр (массив байтов) поступает правильно, , а второй байтовый массив (второй кадр), который прибывает, имеет неправильный размер или даже отрицательный.Второй массив байтов, полученный Tcpclient-Tcpserver, имеет отрицательный ответ. Длина байта = 347713.

Это код на стороне клиента, который посылает кадры:

public static void invia(byte[] bytetosend) 
{ 
    byte[] compressed; 
    compressed = Compressor.Compressor.Compress(bytetosend); 

    byte[] bytes = new byte[1024]; 

    try 
    { 
     IPAddress ipAddressremoto = IPAddress.Parse("192.168.1.191"); 
     IPEndPoint remoteEP = new IPEndPoint(ipAddressremoto, 8585); 
     try 
     { 
      if (Form1.z == 0) 
      { 
       Form1.client = new TcpClient(); 
       Form1.client.Connect(remoteEP); 
       Form1.streamclient = client.GetStream(); 
       Form1.z = 1; 
      } 
      Form1.streamclient.Flush(); 
      byte[] sizePacket = new byte[50]; 
      sizePacket = BitConverter.GetBytes(compressed.Length); 
      System.Console.WriteLine("size of packet = " + sizePacket.Length + " compressed.Length = " + compressed.Length + " " + "size inside packet " + BitConverter.ToInt32(sizePacket, 0)); 
      byte[] requestWithHeader = new byte[sizePacket.Length + compressed.Length]; 
      sizePacket.CopyTo(requestWithHeader, 0); 
      bytetosend.CopyTo(requestWithHeader, sizePacket.Length); 
      streamclient.Write(requestWithHeader, 0, requestWithHeader.Length); 
     } 
     catch (ArgumentNullException ane) 
     { 
      Console.WriteLine("ArgumentNullException : {0}", ane.ToString()); 
     } 
     catch (SocketException se) 
     { 
      Console.WriteLine("SocketException : {0}", se.ToString()); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Unexpected exception : {0}", e.ToString()); 
     } 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e.ToString()); 
    } 
} 

это вместо того, чтобы код на стороне сервера, который получает кадр, где, к сожалению, я получаю правильно, с правом размера кадра только первым но не второй FRAM NB: некоторые старые инструкции описаны, а не удалена

public WindowsFormsServer() 
{ 
    var frameTask = Task.Factory.StartNew(() => 
    { 
     try 
     { 
      while (true) 
      { 
       if (WindowsFormsServer.y == 0) 
       { 
        WindowsFormsServer.server = WindowsFormsServer.Idea_server(); 
        // WindowsFormsServer.server.ReceiveTimeout = 50000; 
        //   Console.WriteLine("Waiting for a connection..."); 
        WindowsFormsServer.streamserver = server.GetStream(); 
       } 
       //streamserver.Flush(); 

       byte[] responseBytes = null; 

       //if (streamserver.CanRead) 
       //{ 
        var responseStream = new System.IO.MemoryStream(); 
        byte[] sizePacket = new byte[50]; 

        streamserver.Read(sizePacket, 0, sizePacket.Length); 
        int responseLength = BitConverter.ToInt32(sizePacket, 0); 
        System.Console.WriteLine("size of packet = " + sizePacket.Length + "size inside packet = " + responseLength); 
        byte[] response = new byte[responseLength]; 

        int bytesReceived = 0; 
        while (bytesReceived < responseLength) 
        { 
         int bytesRead = streamserver.Read(response, bytesReceived, responseLength - bytesReceived); 
         bytesReceived += bytesRead; 
        } 
        System.Console.WriteLine("frameTask attivo \r\n"); 
        responseStream.Write(response, 0, responseLength); 
        //System.Threading.Thread.Sleep(1); //added this line 
        responseBytes = responseStream.ToArray(); 
        Console.WriteLine("responseBytes Length = " + responseBytes.Length); 
       //} 
      } 
     } 
     catch (NullReferenceException ex) 
     { 
      System.Console.WriteLine("Errore: " + ex.ToString()); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 

     try 
     { 
      //MessageData.Picture2 = (Bitmap)byteArrayToImage(Compressor.Compressor.Decompress(responseBytes)); 
      MessageData.Picture2 = (Bitmap)byteArrayToImage(responseBytes); 
      CamImageBox.Image = MessageData.Picture2; 
     } 
     catch (NullReferenceException ex) 
     { 
      System.Console.WriteLine("Errore: " + ex.ToString()); 
     } 
     catch (Exception ex) 
     { 
      System.Console.WriteLine("Errore: " + ex.ToString()); 
     } 

    }); 
    //frameTask.Start(); 
    InitializeComponent(); 
} 

Это ошибка на стороне сервера, который принимает кадр как массив байт

'WindowsFormsServer.vshost.exe' (CLR v4.0.30319: WindowsFormsServer.vshost.exe): caricamento di 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll' completato. Caricamento dei simboli ignorato. Il modulo è ottimizzato e l'opzione del debugger 'Solo codice utente' è abilitata. 
lunghezza = 5 

ЭТО Продолжительность курса, которые используют заголовок к WRITE РАЗМЕРА стороне клиента ОТПРАВИТЕЛЬ байтовый массив фрейм, а затем я прочитал на стороне сервера Receiver

inviocomandoTask attivo 
  • размер пакета = 50
  • размер внутри пакет = 347713

Это длина полученного первого кадра, и это правильно, потому что оно отправлено отправителем.

'WindowsFormsServer.vshost.exe' (CLR v4.0.30319: WindowsFormsServer.vshost.exe): caricamento di 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_it_b77a5c561934e089\mscorlib.resources.dll' completato. Modulo compilato senza simboli. 

frameTask attivo

  • responseBytes длина = 347713
  • размер пакета = 50
  • размер внутри пакета = -383988050

это длина полученного второго кадра и это неправильно

Eccezione generata: 'System.OverflowException' in WindowsFormsServer.exe 
Eccezione generata: 'System.ArgumentNullException' in mscorlib.dll 
System.OverflowException: Le dimensioni della matrice hanno superato l'intervallo supportato. The size of the array exceeded the supported range. 
    in WindowsFormsServer.WindowsFormsServer.<.ctor>b__12_0() in C:\Users\vmtest\Documents\CamDisplay4\WindowsFormsServer\Form1.cs:riga 70 
Errore: System.ArgumentNullException: Il buffer non può essere null. 
Nome parametro: buffer 
    in System.IO.MemoryStream..ctor(Byte[] buffer, Boolean writable) 
    in WindowsFormsServer.WindowsFormsServer.byteArrayToImage(Byte[] bytesArr) in C:\Users\vmtest\Documents\CamDisplay4\WindowsFormsServer\Form1.cs:riga 170 
    in WindowsFormsServer.WindowsFormsServer.<.ctor>b__12_0() in C:\Users\vmtest\Documents\CamDisplay4\WindowsFormsServer\Form1.cs:riga 98 
Il thread 0x19ec è terminato con il codice 0 (0x0). 
Il thread 0x19d4 è terminato con il codice 0 (0x0). 
Il programma '[1352] WindowsFormsServer.vshost.exe' è terminato con il codice 0 (0x0). 

У вас есть предложения о том, что происходит в этом втором массиве кадра байт получили? * Как вы думаете, что это вызвано с сервера, что он принимающий байтами в синхронном режиме без ASYNC метод?

+0

Я попытался изменить ваш вопрос, чтобы решить некоторые из форматирования iss которые затруднят для других возможность прочитать ваш вопрос. Я использовал методы в разделе «[Как мне отформатировать мои сообщения с помощью Markdown или HTML?] (Http://stackoverflow.com/help/formatting)» для этого. –

+0

Я также удалил итальянские (?) Части вашего вопроса, которые сразу же последовали английским переводам. Если я сделал какие-либо ошибки там, пожалуйста, не стесняйтесь изменять мои изменения. На сайте English Stack Overflow существует [политика по неанглийским вопросам] (http://blog.stackoverflow.com/2009/07/non-english-question-policy/), которая будет применяться к вам; итальянские части не нужны, поскольку вы разместили приемлемые переводы на английском языке. –

ответ

0
byte[] sizePacket = new byte[50]; 
streamserver.Read(sizePacket, 0, sizePacket.Length); 

Здесь вы читаете 50 байтов, но используете только первые 4 байта. Остальное выбрасывается.

Я хотел бы сделать это:

var br = new BinaryReader(someStream); 
var length = br.ReadUInt32(); 
var contents = br.ReadBytes(length); 

Это действительно все, что вам нужно.


 byte[] sizePacket = new byte[50]; 
     sizePacket = BitConverter.GetBytes(compressed.Length); 

Почему всегда 50 байт ?? Это не имеет никакого смысла. Сначала используйте нужную длину. Здесь вы перезаписать эту переменную в любом случае, так что это должно быть:

 byte[] sizePacket = BitConverter.GetBytes(compressed.Length); 

System.Console.WriteLine("size of packet = " + sizePacket.Length + "size inside packet = " + responseLength); 

И это сообщение является ложным. Это не размер «пакета». TCP не предоставляет пакеты. Размер массива равен 50, считывает возвращаемое значение из Read, которое может отличаться от 50.

+0

благодарю вас за ответ, и да ... Я забыл о том, что длина заголовка int составляет 4 байта ..... –

0

Теперь я изменил, как вы говорите, код: Но я думаю, что это неправильно и может быть изменено, infact on часть приемника мне нужно установить размер кадра, когда я иду, чтобы создать массив байтов перед тем, что я получаю кадр, так что я сделал это:

     var br = new BinaryReader(streamserver); 
         var length = br.ReadUInt32(); 
         var responseLength = br.ReadBytes(4); 
         int responseIntLength = BitConverter.ToInt32(responseLength, 0); 
         byte[] response = new byte[responseIntLength]; 

это новый полный приемник на стороне сервера TCP

public WindowsFormsServer() 
    { 
     var frameTask = Task.Factory.StartNew(() => 
     { 

      try 
      { 
       while (true) 
       { 
         if (WindowsFormsServer.y == 0) 
         { 
          WindowsFormsServer.server = WindowsFormsServer.Idea_server(); 
          // WindowsFormsServer.server.ReceiveTimeout = 50000; 
          //   Console.WriteLine("Waiting for a connection..."); 
          WindowsFormsServer.streamserver = server.GetStream(); 
         } 
         //streamserver.Flush(); 

         byte[] responseBytes = null; 

         //if (streamserver.CanRead) 
         //{ 
          var responseStream = new System.IO.MemoryStream(); 
          byte[] sizePacket = new byte[4]; 

          var br = new BinaryReader(streamserver); 
          var length = br.ReadUInt32(); 
          var responseLength = br.ReadBytes(4); 
          int responseIntLength = BitConverter.ToInt32(responseLength, 0); 
          byte[] response = new byte[responseIntLength]; 
          System.Console.WriteLine("size inside responseIntLength = " + responseLength); 

          int bytesReceived = 0; 
          while (bytesReceived < responseIntLength) 
          { 
           int bytesRead = streamserver.Read(response, bytesReceived, responseIntLength - bytesReceived); 
           bytesReceived += bytesRead; 
          } 
          System.Console.WriteLine("frameTask attivo \r\n"); 
          responseStream.Write(response, 0, responseIntLength); 
          //System.Threading.Thread.Sleep(1); //added this line 
          responseBytes = responseStream.ToArray(); 
          Console.WriteLine("responseBytes Length = " + responseBytes.Length); 
         //} 
       } 
      } 
      catch (NullReferenceException ex) 
      { 
       System.Console.WriteLine("Errore: " + ex.ToString()); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
      } 

      try 
      { 
       //MessageData.Picture2 = (Bitmap)byteArrayToImage(Compressor.Compressor.Decompress(responseBytes)); 
       MessageData.Picture2 = (Bitmap)byteArrayToImage(responseBytes); 
       CamImageBox.Image = MessageData.Picture2; 
      } 
      catch (NullReferenceException ex) 
      { 
       System.Console.WriteLine("Errore: " + ex.ToString()); 
      } 
      catch (Exception ex) 
      { 
       System.Console.WriteLine("Errore: " + ex.ToString()); 
      } 

     }); 
     //frameTask.Start(); 
     InitializeComponent(); 
    }