Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 915

/ вопрос открыт /

Здравствуйте!
Подскажите пожалуйста на примере и если это вообще реализуемо как можно сравнить имеющуюся udp-датаграмму с приходящими из сети.
Спасибо.

Adam264 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Adam264 (статус: Посетитель)
Вопрос отправлен: 29 января 2012, 13:57
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 30 января 2012, 08:56; участников в обсуждении: 2.
min@y™

min@y™ (статус: Доктор наук), 29 января 2012, 15:28 [#1]:

Как на счёт сравнивнивать тупо ПОБАЙТНО?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Adam264

Adam264 (статус: Посетитель), 29 января 2012, 17:04 [#2]:

Хоть побайтно, хоть массивами, не столь важно, главное скорость обработки. Сравнение нужно осуществлять в процессе мониторинга udp-трафика, реагировать на определнную часть датаграммы и по нахождению вытаскивать IP.
Adam264

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™

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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:35
Выполнено за 0.03 сек.