Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с приложением клиент-сервер [D7, WinXP]


Страницы:   1 2 3

Colonel ©   (2008-09-01 21:17:00) 

Доброго всем времени суток,

подскажите в чем может быть проблема: пытаюсь сделать простое приложение клиент сервер, но не работает.

Вот код сервера:

procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Active := True;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
var
j : integer;
begin
i := ServerSocket1.Socket.ReceiveText;
For j := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
 if ServerSocket1.Socket.Connections[j].SocketHandle Socket.SocketHandle then
  if i = 'status' then ServerSocket1.Socket.Connections[j].SendText('Ok. Connected. Listenning.');
if i = 'logoff' then MyExitWindows(EWX_LOGOFF or EWX_FORCE);
if i = 'reboot' then MyExitWindows(EWX_REBOOT or EWX_FORCE);
if i = 'force reboot' then MyExitWindows(EWX_FORCEIFHUNG or EWX_FORCE);
if i = 'shutdown' then MyExitWindows(EWX_SHUTDOWN or EWX_FORCE);
if i = 'power off' then MyExitWindows(EWX_POWEROFF or EWX_FORCE);
end;


Вот код клиента:

procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
begin
sb.SimpleText := 'Ïîäêëþ÷åíèå ïðîèçîøëî óñïåøíî';
e_command.Visible := true;
end;

procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
 ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
sb.SimpleText := 'Ïðîèçîøëà îøèáêà';
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
sb.SimpleText := 'Êëèåíò îòêëþ÷åí';
end;

procedure TForm1.ClientSocket1Connecting(Sender: TObject;
 Socket: TCustomWinSocket);
begin
sb.SimpleText := 'Ïîäêëþ÷àþñü ...';
end;

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
i := Socket.ReceiveText;
sb.SimpleText := i;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
ClientSocket1.Active := false;
ClientSocket1.Close;
Close;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Address := PChar(e_ip.text);
if not ClientSocket1.Active then ClientSocket1.Active := true;
//ClientSocket1.Open;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Active := false;
ClientSocket1.close;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText(e_command.text);
sb.SimpleText := 'Äàííûå îòïðàâëåíû';
end;


Соединение происходит нормально, а вот когда посылаю команду, то на стороне клиента выдается такая ошибка: Asynchronous socket error 10053, а на стороне сервера такая: Windows socket error: A request to send or receive data was disallowed because is socket not connected and (when sending on a datagram socket using a sendto call) no adress was supplied (10057), on "API" recv. Как это можно исправить ? В чем проблема ?

Спасибо огромное за помощь.


Polevi   (2008-09-04 21:24:00) [1]

да, он отладит на локальной а потом в реале работать не будет..
s:=Socket.ReceiveText;

классика жанра


Сергей М.   (2008-09-04 15:06:00) [2]

Я ж тебе сказал - мухи отдельно, а котлеты отдельно !
Что тебе до сих пор не понятно ?
Отдельно на локальноймашине создаешь и отлаживаешь модуль, ответственный за работу с логинами, рибутом и пр. (форум WinAPI), отдельно же на локальной и удаленной машинах отрабатываешь отдельныймодуль, ответственный за транспорт произвольных данных по сети (форум Сети). И только потом их объединяешь эти две в целом непересекающиеся части в единый "организм".


Colonel   (2008-09-04 14:29:00) [3]

Господа, Вы все правы и я уже пожалел что подписался на эту контору, но, увы, назад пути нет. Вот поэтому и приходится придумывать всякие ненужные проги для того, чтобы прежде всего себе облегчить хоть как-то жизнь ...

Поэтому и прошу помощи ...


Сергей М.   (2008-09-04 10:23:00) [4]


> Slym ©   (04.09.08 10:10) [50]


У них там, видимо, полный бардак в конторе: сапожник печет пироги, а пирожник (админ ихний) ни пироги не печет ни сапоги не тачает ..


Slym   (2008-09-04 10:10:00) [5]

Это пипец... пользовать RDP для настройки IP АТС... зачем прокладка?
если маршрутизации к ней нет, то поставь простенький портмапер на твой "сервер" и через него и лазь...


Сергей М.   (2008-09-04 08:35:00) [6]


> Colonel   (03.09.08 23:34) [48]


Хм ..

А что, разве нет возможности прямо со своего хоста, минуя эту самую RDP-"прокладку", достучаться до станции по Ethernet ?


Colonel   (2008-09-03 23:34:00) [7]

Настраиваю IP Office 500 для нужд абонентов.


Сергей М.   (2008-09-03 16:31:00) [8]


> единственная машина, с которой у меня возникли такие проблемы


А ты что вообще делаешь на том удаленном раб.столе ?

Что ты там забыл и почему админ отказывается содействовать тебе или хотя бы дать твоей уч.записи на том хосте права администрирования, чтобы ты мог полноценно и самомтоятельно решать требуемые тебе задачи ?

Поясни ..


Colonel   (2008-09-03 16:02:00) [9]

Я бы выразился по-другому насчет того админа ...

Да нет, здесь Вы неправы, это единственная машина, с которой у меня возникли такие проблемы ...


> Anatoly Podgoretsky ©   (03.09.08 15:21) [44]
> У тебя админ философ-пофигист.
> А RDP зависающий это твоя проблема, у меня не зависающий


Еще есть идеи господа ? Ну помогите мне ....


Сергей М.   (2008-09-03 15:25:00) [10]


> Colonel   (03.09.08 14:49) [43]


> зачем тогда писать ?


Затем чтобы ты учился отделять мух от котлет.


Anatoly Podgoretsky   (2008-09-03 15:21:00) [11]

> Colonel  (03.09.2008 13:58:39)  [39]

У тебя админ философ-пофигист.
А RDP зависающий это твоя проблема, у меня не зависающий


Colonel   (2008-09-03 14:49:00) [12]

Сергей, если Вы не знаете / не можете / не хотите что-либо подсказать / показать по этой тематике - зачем тогда писать ?

Ставить именно что нельзя (имеется ввиду инсталляция), а по FTP залить и запустить простое приложение, которое запускается без установки - можно.

> Сергей М. ©   (03.09.08 14:29) [42]
>
> К любой другой.
>
> А говоришь "поставить ничего нельзя")
>
> Нехорошо вводить в заблуждение)


Сергей М.   (2008-09-03 14:29:00) [13]


> К какой же тогда интересно тематике это относится ?


К любой другой.

Чем, собственно, локальный релогин отличается от нелокального ?
Ничем. Разница лишь в том, что программой, осуществляющей такие манипуляции, можно управлять "ручками", если программа локальна, или удаленными "ручками", если программа не локальна. А уж таинства самих манипуляций скрываются за соответствующим WinAPI.


> Заливаю файл по FTP, потом через RDP запускаю его. И все


А говоришь "поставить ничего нельзя")

Нехорошо вводить в заблуждение)


Colonel   (2008-09-03 14:20:00) [14]

К какой же тогда интересно тематике это относится ?


> Этот вопрос выходит за рамки тематики форума "Сети", я тебе
> об этом уже сказал, но ты упорно не реагируешь.
>
> И, кстати, как же ты тогда собрался использовать свое творение,
>  если



Заливаю файл по FTP, потом через RDP запускаю его. И все.

> ?


Сергей М.   (2008-09-03 14:11:00) [15]


> Как мне организовать залогинивание на PC


Этот вопрос выходит за рамки тематики форума "Сети", я тебе об этом уже сказал, но ты упорно не реагируешь.

И, кстати, как же ты тогда собрался использовать свое творение, если


> поставить туда ничего нельзя


?


Colonel   (2008-09-03 13:58:00) [16]

А подробнее можно про ключевые отличия? Как мне организовать залогинивание на PC ????

Нет, не Кулибин )

Если бы это просто было так, то я бы даже и не зашел сюда. Админ меня давно послал с текстом - тебе это нужно, ты этим и занимайся - хоть катайся каждые полчаса сюда и ребутай машину. Да и поставить туда ничего нельзя. Вот и остается два выхода: либо туда кататься каждый раз, либо найти выход с использование подвисающего RDP. Вот такие вот дела. Я пошел по пути наименьшего сопротивления для меня....


> Сергей М. ©
> Ключевые отличия - блокирующий режим без оконных нотификаций,
>  реализован простейший аккумулятор/парсер вх.потока.
>
> Твоя фамилия случаем не Кулибин ?)
>
> Во-первых, проблемами "виса" системы системы в целом и RDP-
> сервиса в частности должен заниматься админ, а не программист.
>
>
> Во-вторых, на RDP свет клином не сошелся.


Сергей М.   (2008-09-03 13:48:00) [17]


> Colonel   (03.09.08 13:32) [37]


> приведите пример


Пример уже приведен, см. [32].

Ключевыеотличия - блокирующий режим без оконных нотификаций, реализован простейший аккумулятор/парсер вх.потока.


> я уже "задолбал" своими частыми звонками и просьбами перегрузить
> машину секретаршу. Поэтому и решил написать програмку для
> таких целей


Твоя фамилия случаем не Кулибин ?)

Во-первых, проблемами "виса" системы системы в целом и RDP-сервиса в частности должен заниматься админ, а не программист.

Во-вторых, на RDP свет клином не сошелся.


Colonel   (2008-09-03 13:32:00) [18]

Да это никакой не проект, а просто я уже "задолбал" своими частыми звонками и просьбами перегрузить машину секретаршу. Поэтому и решил написать програмку для таких целей.

Ну, если Вы написали что я неправильно сделал ставку на тот пример, тогда приведите пример, в котором будет все правильно и в котором я смогу выполнить нужные мне операции.


> Сергей М. ©   (03.09.08 13:25) [35]
>
> Зачем же его искать после того как на грабли уже наступил,
>  если это можно предотвратить прямо сейчас, когда проект
> находится пока еще в пуберантном периоде ?
>
> Какой конкретно ?


Slym   (2008-09-03 13:29:00) [19]

Colonel   (03.09.08 13:20) [34]
Ого. А можно вкратце в целом по приложению и по каждой процедуре и функции.

Код напишу, а вот с документацией пошлю лесом... ну не люблю я бумажки :(
1. это блокирующий режим сокета (многопоточный)
2. TServerClientThreadEx - объект-поток для каждого соединения вся работа в ClientExecute
3.
WaitForData - ожидание данных
RecvLn - чтение строки до перевода строки (интер в народе)
SendLn - посыл строки + перевода строки
ProcessCmd - тута обрабатывай команды
4. Buf:string; - буфер накопления

тебе содрать и добавить обработку в ProcessCmd(const CmdStr: string);


Сергей М.   (2008-09-03 13:25:00) [20]


> Буду искать другой способ или разбираться почему этот перестал
> работать


Зачем же его искать послетого как на грабли уже наступил, если это можно предотвратить прямо сейчас, когда проект находится пока еще в пуберантном периоде ?


> пример, на который нужно сделать ставку для решения моей
> задачи


Какой конкретно ?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо