|
Вопрос # 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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|