Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2006, 13:59   #1
khaz
Пользователь
 
Регистрация: 13.12.2006
Сообщений: 13
Печаль проблема с клиент-сервер

Написал приложение по типу клиент-сервер...вроде бы все хорошо, коннетится, отправляет данный, носервер не выполняет команды, посланные клиентом ;(

Вот упрощенный код, где основная задача сервера заключается в том, что по команде клиента 'reboot' компьютер должен перезагрузить, но он чтото не грузится.

//server

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ServerSocket.Close;
end;
procedure TForm1.ServerSocketClientRead(Sende r: TObject;
Socket: TCustomWinSocket);
var str: string;
begin
str:= Socket.ReceiveText;
if str='reboot' then ExitWindowsEx(EWX_SHUTDOWN,0);
end;
procedure TForm1.ServerSocketError(Sender: TObject; Number: Smallint;
var Description: string; Scode: Integer; const Source, HelpFile: string;
HelpContext: Integer; var CancelDisplay: Wordbool);
begin
ShowMessage(Description);
end.


//client

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ClientSocket.Close;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if connected then
ClientSocket.Socket.SendText(Edit2. Text);
end;
procedure TForm1.ClientSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
MessageBox(handle,PChar('Error connecting to'+Edit1.Text),'Error',mb_IconHand +mb_TaskModal);
connected:= false;
SpeedButton2.Caption:='Connect';
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
if connected then
begin
ClientSocket.Active:=false;
SpeedButton2.Caption:='Connect';
connected:= false;
end
else
begin
try
with ClientSocket do
begin
Host := Edit1.Text;
Active := True;
end;
connected:= true;
except
connected:= false;
SpeedButton2.Caption:='Connect';
end;
end;
end;
procedure TForm1.ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
SpeedButton2.Caption:='Disonnect';
end;
end.

Жду ваших советов.
khaz вне форума Ответить с цитированием
Старый 13.12.2006, 16:37   #2
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,608
По умолчанию

Так какой код должен перезагружать?
Alar вне форума Ответить с цитированием
Старый 13.12.2006, 18:22   #3
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Цитата:
Сообщение от Alar Посмотреть сообщение
Так какой код должен перезагружать?
Вот этот:
Цитата:
ExitWindowsEx(EWX_SHUTDOWN,0);
Я делал как у флёнова писалось, но были глюки с приёмом сообщений (а может я тупил), решение сделал такое (не надо смеяться) я просто 2 раза подряд отсылал одно и тоже сообщение:

Код:
ClientSocket.Socket.SendText(Edit2.Text);
ClientSocket.Socket.SendText(Edit2.Text);
Грубо так
zetrix вне форума Ответить с цитированием
Старый 13.12.2006, 18:27   #4
Сильванович Михаил
Студент
Форумчанин
 
Регистрация: 10.11.2006
Сообщений: 196
По умолчанию

Попробуй reboot вот этой процедуркой

function MyExitWindows(RebootParam: Word): Boolean;

function IsWin9x: Bool; {True = Win9x, False = NT}
asm
xor eax, eax
mov ecx, cs
xor cl, cl
jecxz @@quit
inc eax
@@quit:
end;

var
TTokenHd: Cardinal;
TTokenPvg: TTokenPrivileges;
cbtpPrevious: DWORD;
rTTokenPvg: TTokenPrivileges;
pcbtpPreviousRequired: DWORD;
tpResult: Boolean;
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';

begin
if IsWin9x = False then
begin
tpResult := OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TTokenHd);
if tpResult then
begin
tpResult := LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, TTokenPvg.Privileges[0].Luid);
TTokenPvg.PrivilegeCount := 1;
TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
cbtpPrevious := SizeOf(rTTokenPvg);
pcbtpPreviousRequired := 0;
if tpResult then
Windows.AdjustTokenPrivileges(TToke nHd, False, TTokenPvg, cbtpPrevious, rTTokenPvg, pcbtpPreviousRequired);
end;
end;
Result := ExitWindowsEx(RebootParam, 0);
end;

В твоем коду проблема в том, что у проги нет прав на то, чтобы
выключить/перезагрузить Windows.

To Alar: ExitWindowsEx(EWX_SHUTDOWN,0); //по видимому
Visita Interiorem Terrae Rectificando Operae Lapidem...
Сильванович Михаил вне форума Ответить с цитированием
Старый 13.12.2006, 19:33   #5
khaz
Пользователь
 
Регистрация: 13.12.2006
Сообщений: 13
По умолчанию

To Cильванович Михаил

Огромное спасибо. Но все равно чтото не получается=(
Я был бы вам очень благодарен если бы вы показали куда именно это впихнуть. И еще один вопрос- эта процедурка похоже только под вин9х и НТ, под ХП она прокатит?
khaz вне форума Ответить с цитированием
Старый 13.12.2006, 21:28   #6
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Если в нт катит, то в хр тоже должна, в хр платформа-то нт.
zetrix вне форума Ответить с цитированием
Старый 13.12.2006, 22:08   #7
khaz
Пользователь
 
Регистрация: 13.12.2006
Сообщений: 13
По умолчанию

можете продемонстрировать как будет в итоге выглядеть код, а то я чтото не найду никак куда это вставить=(

Последний раз редактировалось khaz; 14.12.2006 в 12:36.
khaz вне форума Ответить с цитированием
Старый 14.12.2006, 13:38   #8
Drop
Пользователь Подтвердите свой е-майл
 
Аватар для Drop
 
Регистрация: 14.12.2006
Сообщений: 29
По умолчанию

ExitWindowsEx(EWX_SHUTDOWN,0) работает только под win9х. Если NT или XP сначала нужно взять права администратора.

Делается это так:

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;
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;

короче говоря - вставляешь вышеописаное себе в юнит и вместо ExitWindowsEx(EWX_SHUTDOWN,0) вписываешь WinExit(EWX_SHUTDOWN).
какой вопрос, такой ответ..
Drop вне форума Ответить с цитированием
Старый 14.12.2006, 14:53   #9
Сильванович Михаил
Студент
Форумчанин
 
Регистрация: 10.11.2006
Сообщений: 196
По умолчанию

Цитата:
Сообщение от khaz Посмотреть сообщение
To Cильванович Михаил

Огромное спасибо. Но все равно чтото не получается=(
Я был бы вам очень благодарен если бы вы показали куда именно это впихнуть. И еще один вопрос- эта процедурка похоже только под вин9х и НТ, под ХП она прокатит?
Для перезагрузки, если я не ошибаюсь пойдет и MyExitWindows(0);,
а код самой функции встаить можно в любое место в модуле.
Visita Interiorem Terrae Rectificando Operae Lapidem...
Сильванович Михаил вне форума Ответить с цитированием
Старый 14.12.2006, 15:16   #10
khaz
Пользователь
 
Регистрация: 13.12.2006
Сообщений: 13
По умолчанию

TO DROP TO МИХАИЛ
Tsenks !
все отлично работает
чтобы я без вас делал

Последний раз редактировалось khaz; 14.12.2006 в 15:45.
khaz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клиент-сервер-клиент Кронос Работа с сетью в Delphi 3 24.08.2007 07:57
Клиент-Сервер snakesoft Работа с сетью в Delphi 8 20.07.2007 17:34
клиент сервер Oksana1988 Фриланс 3 10.04.2007 12:12
Клиент-сервер Scorpio Работа с сетью в Delphi 6 13.02.2007 22:57