| 
| 
 | Вопрос # 5 915/ вопрос открыт / | 
 |  Здравствуйте!Подскажите пожалуйста на примере и если это вообще реализуемо как можно сравнить имеющуюся udp-датаграмму с приходящими из сети.
 Спасибо.
 
|  |   Вопрос задал: Adam264 (статус: Посетитель)Вопрос отправлен: 29 января 2012, 13:57
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 4; последнее сообщение — 30 января 2012, 08:56; участников в обсуждении: 2. 
|   | min@y™ (статус: Доктор наук), 29 января 2012, 15:28 [#1]:Как на счёт сравнивнивать тупо ПОБАЙТНО? Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Adam264 (статус: Посетитель), 29 января 2012, 17:04 [#2]:Хоть побайтно, хоть массивами, не столь важно, главное скорость обработки. Сравнение нужно осуществлять в процессе мониторинга udp-трафика, реагировать на определнную часть датаграммы и по нахождению вытаскивать IP. |  
|   | Adam264 (статус: Посетитель), 29 января 2012, 21:39 [#3]:К примеру вот такая датаграмма: http://i031.radikal.ru/1201/25/3776b36a534b.jpg
 в ней нужно найти словосочетание "uses modified data file -" и отправить на адрес её назначения(192.168.10.101 или c0 a8 0a 65), который также в датаграмме, другую заранее подготовленную датаграмму.
 Хоть какие-нибудь есть варианты?
 |  
|   | min@y™ (статус: Доктор наук), 30 января 2012, 08:56 [#4]: Цитата (Adam264): Хоть какие-нибудь есть варианты?  Да их стопицот мильёнов штук. Принимаешь датаграмму в какой-нить TMemoryStream, ищешь там нужные данные, формируешь ответ, отправляешь.
 Вот тебе функция поиска 4-байтного целого. По аналогии сделаешь поиск строки.
 
 unit General;
 
interface
 
uses
  Messages, Classes;
 
type
  TProgressCallback = procedure(const Progress: Integer) of object;
  TSuccessCallback = procedure(const Address: Int64) of object;
 
const
  WM_RANDOM_VALUE =             WM_USER + 100;
  TargetWindowClassName =       'TTargetMainForm';
  TargetWindowTitle =           'Приложение - цель';
  MainWindowClassName =         'TMainForm';
  MainWindowTitle =             'Управляющее приложение';
 
var
  FindNextAddress: Cardinal = 0;
 
// Поиск адреса первого вхождения 4-байтного целого в потоке
// Возвращает кол-во вхождений.
// вызывает cbProgress() при увеличении прогресса на 1%
// вызывает cbSuccess() при нахождении очередного вхождения
function FindValueInStream(const Value: Cardinal;
                           Stream: TStream;
                           cbProgress: TProgressCallback;
                           cbSuccess: TSuccessCallback): Cardinal;
 
implementation
 
function FindValueInStream(const Value: Cardinal;
                           Stream: TStream;
                           cbProgress: TProgressCallback;
                           cbSuccess: TSuccessCallback): Cardinal;
var
  MayBe: Cardinal;
  B,
  LeftByte: Byte;  // мл. байт
  Progress, OldProgress: Integer;
begin
  Result:= 0;
  if not Assigned(cbSuccess)
    then Exit;
 
  OldProgress:= 0;
 
  if Stream.Position <> 0
    then Stream.Position:= 0;
 
  LeftByte:= Value and $FF;
  while Stream.Position < Stream.Size do
    begin
      if Stream.Read(B, 1) <> 1
        then Exit;
 
      if B <> LeftByte
        then Continue
        else begin
               if Stream.Read(MayBe, 3) <> 3
                 then Exit; // читаю 3 остальных байта
               MayBe:= (MayBe shl 8) + B; // Соединяю с младшим байтом
 
               if Value = MayBe
                 then begin
                        Inc(Result);
                        cbSuccess(Stream.Position - 4)
                      end
                 else Stream.Seek(-3, soFromCurrent);
             end;
 
      // Вызов события по прогрессу
      if Assigned(cbProgress)
        then begin
               Progress:= Round(100 * Stream.Position / Stream.Size);
               if Progress <> OldProgress
                 then begin
                        OldProgress:= Progress;
                        cbProgress(Progress);
                      end;
             end;
    end;
end;
 
end.Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |