Вот посмотри - клиент соединяется с сервером посылает ему команду, тот в ответ посылает, что команда принятв, выполняет определенные действия. Delphi 6. Использованы TserverSocket и TClientSocket. Думаю разберешься. Ничего сложного. | Код | unit cli_main;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, Buttons;
type TfrmMain = class(TForm) CSock: TClientSocket; btnShutdown: TSpeedButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure btnShutdownClick(Sender: TObject); procedure CSockError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure CSockRead(Sender: TObject; Socket: TCustomWinSocket); private { Private declarations } public { Public declarations } end;
var frmMain: TfrmMain;
implementation
{$R *.dfm}
procedure TfrmMain.FormCreate(Sender: TObject); begin try CSock.Open; except ShowMessage ('Не удалось соединиться с удаленным компом'); Close; end; end;
procedure TfrmMain.FormDestroy(Sender: TObject); begin if CSock.Active then CSock.Close; end;
procedure TfrmMain.btnShutdownClick(Sender: TObject); begin try CSock.Socket.SendText('#shutdown'); except ShowMessage ('Не удалось послать удаленному компу сообщение'); Close; end; end;
procedure TfrmMain.CSockError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin ErrorCode:=0; end;
procedure TfrmMain.CSockRead(Sender: TObject; Socket: TCustomWinSocket); var cmd: string; begin cmd:=Socket.ReceiveText; if cmd = '#S' then Close; end;
end.
|
| Код |
unit serv_main;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ScktComp;
type TfrmMain = class(TForm) mMessages: TMemo; CSock: TServerSocket; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure CSockClientRead(Sender: TObject; Socket: TCustomWinSocket); private { Private declarations } public { Public declarations } end;
var frmMain: TfrmMain;
implementation
{$R *.dfm}
function SetPrivilege(aPrivilegeName: string; aEnabled: boolean): boolean; var TPPrev, TP: TTokenPrivileges; Token: THandle; dwRetLen: DWord; begin Result := False; OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token);
TP.PrivilegeCount := 1; if (LookupPrivilegeValue(nil, PChar(aPrivilegeName), TP.Privileges[0].LUID)) then begin if (aEnabled) then TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else TP.Privileges[0].Attributes := 0;
dwRetLen := 0; Result := AdjustTokenPrivileges(Token, False, TP, SizeOf(TPPrev), TPPrev, dwRetLen); end; CloseHandle(Token); end;
function WinExit(iFlags: integer): boolean; // EWX_LOGOFF // EWX_REBOOT // EWX_SHUTDOWN begin Result := True; if (SetPrivilege('SeShutdownPrivilege', true)) then begin if (not ExitWindowsEx(iFlags, 0)) then begin Result := False; end; SetPrivilege('SeShutdownPrivilege', False) end else begin Result := False; end; end;
procedure TfrmMain.FormCreate(Sender: TObject); begin CSock.Open; end;
procedure TfrmMain.FormDestroy(Sender: TObject); begin if CSock.Active then CSock.Close; end;
procedure TfrmMain.CSockClientRead(Sender: TObject; Socket: TCustomWinSocket); var cmd: string; I: Integer; begin cmd:=Socket.ReceiveText; if cmd = '#shutdown' then begin mMessages.Lines.Add('Выключение компьютера...'); for I:=0 to CSock.Socket.ActiveConnections-1 do CSock.Socket.Connections[I].SendText('#S'); WinExit(EWX_SHUTDOWN); end; end;
end.
|
Посылка данных : CSock.Socket.SendText; (CSock - это компонент типа TClientSocket) Прием данных : В событии CSockClientRead (...) Socket.ReceiveText; (CSock - это компонент типа TServerSocket). Это пример как "один комп выключает другой".
--------------------
null
|