А вот тут как раз классы и надо бы использовать.
Надо создавть 2 класса. Один - для "компьютера", воторой - для коммутатора. Причем второй делаем синглтоном (т.е. прячем конструктор и наружу показываем функцию, которая просто возвращает ссылку на нужный нам объект). А далее зависит от степени правдоподобности модели.
Код:
type
TNetPacket = record
// Здесть твоя структура пакета
end;
TRouter = class; // forward declaration
TComputer=class
private
FMAC : String;
FRouter : TRouter
public
constructor Create(AMAC : String);
procedure recv(Data : TNetPacket);
procedure send(Data : TNetPacket);
property MAC : String read FMAC;
end;
TRouter = class
private
FClients : TStringList;
function GetCount : Integer;
function GetClient(Index : Integer) : String;
protected
constructor Create; virtual;
public
procedure recv(Data : TNetPacket);
procedure send(Data : TNetPacket);
property Clients[Index : Integer] : String read GetClient;
property Count : Integer read GetCount;
end;
...
function GetRouter : TRouter;
implementation
var
_Router : TRouter;
function GetRouter : TRouter;
begin
If Not Assigned(_Router) Then _Router := TRouter.Create;
Result := _Router;
...
initialization
_Router := Nil;
finallization
If Assigned(_Router) Then _Router.Free;
end.
Ну там еще можно разные эвенты навешать, что бы логировать происходящее...
Смысл примерно такой. При создании "компьютер" регистрируется у роутера (тот запоминает его MAC и ссылку на объект). Далее если надо что-то отправить, то клиент вызывает либо свой метод send, который вызовет метод recv роутера, либо напрямую "дергать" роутер. Роутер, получив пакет и найдя получателя по MAC-адресу, вызовер соотв. метод recv этого клиента.