Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2014, 18:00   #1
skew
Новичок
Джуниор
 
Регистрация: 19.09.2012
Сообщений: 2
По умолчанию Склеивание пакетов\Объединение

Добрый вечер. Написал свой сниффер, но столкнулся с такой проблемой, как неполные пакеты, а быть точнее из за их большого размера от сервера поступает только часть пакета, потом следующая часть и тд и по частям они заносятся в список. А моя задача один пакет полностью засунуть в массив байт и дальше вывести в список. Написал вот такой код
Код:
     
public byte[] sendPck = {}, nu = {};
        int leng=0, ln=0;
   public void OnReceive(IAsyncResult ar)
        {
            try { var state = ar.AsyncState as SocketStateObject;               
                    if (state == null)
                        throw new InvalidOperationException();
						
                    if (!state.From.Connected)
                    {
                        OnDisconnected();
                        return;
                    }

                    var receivedBytes = state.From.EndReceive(ar); 
                    if (receivedBytes <= 0 || !state.To.Connected)
                    {
                        OnDisconnected();
                        return;
                    }
                
                    byte[] bytesToSend = state.FromBuffer.Take(receivedBytes).ToArray();// Входящие байты
                 
                  if(leng <= 0) 
                  { 
                      leng = BitConverter.ToInt16(bytesToSend,0);  //по первым 2 байтам получаю длину полного пакета                  
                      ln = bytesToSend.Length;  //длина входящего пакета                   
                      sendPck = WriteBytes(sendPck, bytesToSend);   //добавляю полученный массив байт в пустой массив               
                  } 
                  else                
                  if(ln < leng)
                  {
                      ln += bytesToSend.Length; //прибавляю длину до тех пор пока полная длина не будет равна склеенному
                      sendPck = WriteBytes(sendPck, bytesToSend); //добавляю в конец массива байт входящий массив
                  }
                  
                  if (ln == leng)
                  {                            
                          if (state.IsC2S)                                                      
                                  MainForm.Connection_sent(bytesToSend, true);   //заношу в список
                          else
                                  MainForm.Connection_sent(bytesToSend, false);  //заношу в список
                                          
                      state.To.BeginSend(sendPck, 0, sendPck.Length, SocketFlags.None, null, null);//отправляю на сервер
                      sendPck = nu;//обнуляю массив {}
                      leng = 0;
                  }
                    state.ResetFromBuffer();
                    state.From.BeginReceive(state.FromBuffer, 0, state.FromBuffer.Length, SocketFlags.None, OnReceive, state);
                }    
                catch{}
        }



если ставлю проверку if (ln == leng) то если в момент отправки мне этого пакета приходит еще какой нибудь и длина уже не будет равна нужной и пакет станет кривым
а если if (ln >= leng)
вот где куча нулей, это должен быть 1 целый пакет в 16249 байт, а его все равно разрывает

Последний раз редактировалось skew; 27.12.2014 в 18:28.
skew вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Склеивание фотографии Кинельски Мультимедиа в Delphi 8 01.06.2010 02:30
склеивание Dimarik Общие вопросы C/C++ 3 15.09.2009 13:58
Склеивание пакетов TClientSocket mar4elo Работа с сетью в Delphi 1 18.02.2009 19:38
Склеивание звуков varvara16 Мультимедиа в Delphi 24 14.11.2008 18:24
склеивание форм blackstersl Общие вопросы Delphi 1 29.10.2008 19:16