-
> По поводу телнета вообще не думал
А дело даже не в телнете. Просто использование любого телнет-клиента наглядно продемонстрирует, мягко говоря, недостаток в реализованной тобой логике)
-
Хм ... А при чем здесь моя логика ? Пробовал я и телнет и ssh, для этих целей юзал putty, но, это не помогло решить мою проблему, поэтому решил попробовать написать подобную прогу.
> Сергей М. © (03.09.08 09:34) [20] > > А дело даже не в телнете. > Просто использование любого телнет-клиента наглядно продемонстрирует, > мягко говоря, недостаток в реализованной тобой логике)
Суть в том, что висит RDP (либо сессия подвисает, либо включается блокировка атоматическаяю При чем удаленно не работает даже logoff - при попытке сделать logoff RDP виснет), т.к я делаю разные операции удаленно через RDP, то, когда он висит - единственный выход - ребутнуть машину - чтобы заново подключиться.
> Slym © (03.09.08 09:29) [19] > > :) а как она перегрузится есле она висит? > не лучше найти и устранить причину подвисания?
-
> при чем здесь моя логика ?
Притом что она ошибочна. Как минимум в части отсутствия напрочь аккумулирования принимаемых данных.
-
Сергей, видимо Вы даже не читали [11]. Исходя из этого я могу высказать тоже самое и о Вашей логике.
> Сергей М. © (03.09.08 10:12) [22] > Как минимум в части отсутствия напрочь аккумулирования принимаемых > данных.
-
> Colonel (03.09.08 10:24) [23]
Ну-ну.
Продолжай в том же духе.
Замечу лишь, что сервер не работает (и не будет работать при таком подходе) у тебя)
-
Colonel (03.09.08 10:03) [21] Суть в том, что висит RDP что за сервер (ОС)? сколько одновременных сессий. сколько процессоров в серваке? Colonel (03.09.08 10:03) [21] Хм ... А при чем здесь моя логика ? Пробовал я и телнет и ssh, для этих целей юзал putty, но, это не помогло решить мою проблему, поэтому решил попробовать написать подобную прогу. просто к твоему серверу придется писать клиент... хотя можно в качестве клиента пользовать телнет: открыл телнет, подключился, набрал ребут... Но чтение у тебя без накопрения и в ServerSocket1ClientRead ReceiveText вернет тебе последовательно r e b o o t а не то что ты ожидаеш - reboot
-
> Colonel (03.09.2008 10:24:23) [23]
Есть разница - не работает у ТЕБЯ
-
О, да Вы еще и невоспитанный человек, интересно что же за высшее образование такое и где Вы его получали ...
А сервер как раз-таки работает, и, если бы Вы внимательно читали посты, то вопрос уже совсем в другом [13]-[17], в особенности интересует [16], [17].
> Сергей М. © (03.09.08 10:28) [24] > > Ну-ну. > > Продолжай в том же духе. > > Замечу лишь, что сервер не работает (и не будет работать > при таком подходе) у тебя)
Клиент уже написан и он выполняет то, что нужно, вопрос уже в другом уважаемый Slym [13]-[17], в особенности интересует [16], [17]. Не знаю, почему Вы решили что не будет работать (Вам видимо виднее), но, у меня все работает, при отправлении команды ребут - машина перегружается. И, я вроде нигде не писал, что это сервер. Это обычный PC с лицензионной (правда корявой, может поэтому там столько проблем) WinXP. И, как я уже писал выше - телнет не помогает, не могу понять почему, хотя коннект происходит и с putty - тоже самое (хотя нет, вру, пару раз было такое, что я подключался через putty, как только посылал shutdown -r - соединение тоже висло, я закрывал сессию, логинился снова - ситуация повторялась).
> Slym © > что за сервер (ОС)? сколько одновременных сессий. сколько > процессоров в серваке? > просто к твоему серверу придется писать клиент... хотя можно > в качестве клиента пользовать телнет: открыл телнет, подключился, > набрал ребут... Но чтение у тебя без накопрения и в > ServerSocket1ClientRead ReceiveText вернет тебе последовательно > r > e > b > o > o > t > а не то что ты ожидаеш - reboot
-
Colonel (03.09.08 11:09) [27] в особенности интересует [16], [17]. в [19] - сервис... по теме телнета: добавляешь новую команду в сервер - переписываешь клиента, а с телнетом тупо новую команду руками пишешь и воркает... я не говорю что нерабочий вариант, но кошернее вариант с телнетом - протокол то текстовый
-
> Не знаю, почему Вы решили что не будет работать
Ты и знать не хочешь) Иначе давно бы спросил.
> я вроде нигде не писал, что это сервер. Это обычный PC
А никому и не интересно что там у тебя за PC.
Речь идет об принципах и особенностях работы поточно-ориентированного TCP, коим ты решил воспользоваться для решения задачи.
В условиях глоб.сети нет никакой гарантии получения принимающей стороной дейтаграмм в том виде, в котором ты ожидаешь.
-
Ну а то что ты еще и [2] проигнорировал, лишний раз подтверждает, что с логикой у тебя дело совсем плохо)
-
А подробнее с этого места можно: хм ... сервис, его еще нужно написать (буду признателен за любую инфу как это сделать на Delphi), потом, чтобы его писать, нужно озадачиться тем, как он будет работать и какие задачи он будет выполнять (опять же, я пока с трудом себе представляю это - буду признателен за любую помощь).
По серверу: какую команду я должен добавить ? И что изменять в клиенте ? И, какую писать команду руками ? Если речь идет про "чистый" телнет, то я уже писал, что он не помогает ...
> Slym © (03.09.08 11:29) [28] > в [19] - сервис... > по теме телнета: добавляешь новую команду в сервер - переписываешь > клиента, а с телнетом тупо новую команду руками пишешь и > воркает... > я не говорю что нерабочий вариант, но кошернее вариант с > телнетом - протокол то текстовый
Сергей, я уже написал, что приложение работает. Теперь мне нужно отловить исключения и сделать так, чтобы не окна выскакивали, а сообщения из исключений передавались в статус бар. И если происходит logoff, то существует ли возможность опять залогиниться именно из моей программы и как это сделать ...
По поводу датаграмм ничего не скажу, здесь я не очень силен. Но, спасибо за замечание.
> Сергей М. © (03.09.08 11:34) [29] > > Ты и знать не хочешь) > Иначе давно бы спросил. > > А никому и не интересно что там у тебя за PC. > > Речь идет об принципах и особенностях работы поточно-ориентированного > TCP, коим ты решил воспользоваться для решения задачи. > > В условиях глоб.сети нет никакой гарантии получения принимающей > стороной дейтаграмм в том виде, в котором ты ожидаешь.
-
program CmdDefSckt;
uses
SysUtils,ScktComp,WinSock;
type
TServerClientThreadEx=class(TServerClientThread)
private
Buf:string;
protected
procedure ClientExecute; override;
function WaitForData(Timeout: Longint): Boolean;
function RecvLn:string;
procedure SendLn(const Str:string);
procedure ProcessCmd(const CmdStr:string);
public
end;
function TServerClientThreadEx.WaitForData(Timeout: Longint): Boolean;
var
FDSet: TFDSet;
TimeVal: TTimeVal;
begin
TimeVal.tv_sec := Timeout div 1000;
TimeVal.tv_usec := (Timeout mod 1000) * 1000;
FD_ZERO(FDSet);
FD_SET(ClientSocket.SocketHandle, FDSet);
Result := select(0, @FDSet, nil, nil, @TimeVal) > 0;
end;
function TServerClientThreadEx.RecvLn:string;
var i:integer;
begin
while ClientSocket.Connected do
begin
if not WaitForData(30000) then raise Exception.Create('Protocol: timeout');
Buf:=Buf+ClientSocket.ReceiveText;
if length(Buf)>256 then raise Exception.Create('Protocol: long string');
i:=pos(#13#10,Buf);
if i>0 then
begin
result:=copy(Buf,1,i-1);
delete(Buf,1,i+1);
break;
end;
end;
end;
procedure TServerClientThreadEx.SendLn(const Str:string);
begin
ClientSocket.SendText(Str);
ClientSocket.SendText(#13#10);
end;
procedure TServerClientThreadEx.ProcessCmd(const CmdStr: string);
begin
if CmdStr='?' then
SendLn('reboot');
end;
procedure TServerClientThreadEx.ClientExecute;
var CmdStr:string;
begin
try
while (not Terminated) and (ClientSocket.Connected) do
begin
CmdStr:=RecvLn;
if length(CmdStr)>0 then
begin
writeln('ProcessCmd ',ClientSocket.RemoteAddress,':',ClientSocket.RemotePort,'- ',CmdStr);
ProcessCmd(CmdStr);
end;
end;
except
on e: exception do
writeln('Error: '+e.Message);
end;
end;
procedure GetThread(Self:TObject;Sender: TObject;ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread);
begin
writeln('GetThreadEvent ',ClientSocket.RemoteAddress,':',ClientSocket.RemotePort);
SocketThread:=TServerClientThreadEx.Create(false,ClientSocket);
end;
function Proc2Method(Code, Data: Pointer):TMethod;
begin
result.Code:=Code;
result.Data:=Data;
end;
var Server:TServerSocket;
begin
Server:=TServerSocket.Create(nil);
try
Server.ServerType:=stThreadBlocking;
Server.Port:=19;
Server.OnGetThread:=TGetThreadEvent(Proc2Method(@GetThread,Server));
Server.Open;
while Server.Active do Sleep(100);
finally
Server.Free;
end;
end.
обращаться так telnet 127.0.0.1 19
reboot
-
> уже написал, что приложение работает
Сегодня работает, а завтра перестанет. Что будешь делать ?
> существует ли возможность опять залогиниться именно из моей > программы
Существует. Но пример, на который ты сделал ставку, такой возможности не даст - он использует оконные сообщения текущего десктопа.
-
Ого. А можно вкратце в целом по приложению и по каждой процедуре и функции.
Спасибо.
> Slym © > > обращаться так > telnet 127.0.0.1 19 > reboot >
Буду искать другой способ или разбираться почему этот перестал работать.
Сергей, будьте так любезны, подскажите пример, на который нужно сделать ставку для решения моей задачи.
Спасибо.
> Сергей М. © (03.09.08 12:31) [33] > > Сегодня работает, а завтра перестанет. > Что будешь делать ? > > Существует. > Но пример, на который ты сделал ставку, такой возможности > не даст - он использует оконные сообщения текущего десктопа. >
-
> Буду искать другой способ или разбираться почему этот перестал > работать
Зачем же его искать после того как на грабли уже наступил, если это можно предотвратить прямо сейчас, когда проект находится пока еще в пуберантном периоде ?
> пример, на который нужно сделать ставку для решения моей > задачи
Какой конкретно ?
-
Colonel (03.09.08 13:20) [34] Ого. А можно вкратце в целом по приложению и по каждой процедуре и функции. Код напишу, а вот с документацией пошлю лесом... ну не люблю я бумажки :( 1. это блокирующий режим сокета (многопоточный) 2. TServerClientThreadEx - объект-поток для каждого соединения вся работа в ClientExecute 3. WaitForData - ожидание данных RecvLn - чтение строки до перевода строки (интер в народе) SendLn - посыл строки + перевода строки ProcessCmd - тута обрабатывай команды 4. Buf:string; - буфер накопления
тебе содрать и добавить обработку в ProcessCmd(const CmdStr: string);
-
Да это никакой не проект, а просто я уже "задолбал" своими частыми звонками и просьбами перегрузить машину секретаршу. Поэтому и решил написать програмку для таких целей.
Ну, если Вы написали что я неправильно сделал ставку на тот пример, тогда приведите пример, в котором будет все правильно и в котором я смогу выполнить нужные мне операции.
> Сергей М. © (03.09.08 13:25) [35] > > Зачем же его искать после того как на грабли уже наступил, > если это можно предотвратить прямо сейчас, когда проект > находится пока еще в пуберантном периоде ? > > Какой конкретно ?
-
> Colonel (03.09.08 13:32) [37]
> приведите пример
Пример уже приведен, см. [32].
Ключевые отличия - блокирующий режим без оконных нотификаций, реализован простейший аккумулятор/парсер вх.потока.
> я уже "задолбал" своими частыми звонками и просьбами перегрузить > машину секретаршу. Поэтому и решил написать програмку для > таких целей
Твоя фамилия случаем не Кулибин ?)
Во-первых, проблемами "виса" системы системы в целом и RDP-сервиса в частности должен заниматься админ, а не программист.
Во-вторых, на RDP свет клином не сошелся.
-
А подробнее можно про ключевые отличия? Как мне организовать залогинивание на PC ????
Нет, не Кулибин )
Если бы это просто было так, то я бы даже и не зашел сюда. Админ меня давно послал с текстом - тебе это нужно, ты этим и занимайся - хоть катайся каждые полчаса сюда и ребутай машину. Да и поставить туда ничего нельзя. Вот и остается два выхода: либо туда кататься каждый раз, либо найти выход с использование подвисающего RDP. Вот такие вот дела. Я пошел по пути наименьшего сопротивления для меня....
> Сергей М. © > Ключевые отличия - блокирующий режим без оконных нотификаций, > реализован простейший аккумулятор/парсер вх.потока. > > Твоя фамилия случаем не Кулибин ?) > > Во-первых, проблемами "виса" системы системы в целом и RDP- > сервиса в частности должен заниматься админ, а не программист. > > > Во-вторых, на RDP свет клином не сошелся.
|