-
Доброго всем времени суток, подскажите в чем может быть проблема: пытаюсь сделать простое приложение клиент сервер, но не работает. Вот код сервера:
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;
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. Как это можно исправить ? В чем проблема ? Спасибо огромное за помощь.
-
Button3 тобой нажимается ПОСЛЕ того как отработает метод ClientSocket1Connect или ДО ?
-
> 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.');
Вот эта логика мне вообще не понятна.
Один из активных клиентов спросил у сервера "Покажи мне свой свой статус", а сервер получив запрос начинает рассылать свой статус всем кому угодно, только не тому кто его запросил ..
-
-
Сергей М. © (02.09.08 9:22) [2] И кстати я не понял почему я стал ниже?
-
> Slym © (02.09.08 11:50) [4]
> почему я стал ниже?
Ну на момент [19]-го поста, где ты был окрещен "чуваком выше", твой пост, где ты сказал про "у меня все работает" и на который сослался автор, действительно был выше по тексту топика)
-
Сергей М. © (02.09.08 12:27) [5] а я подумал что ты меня обидеть пытаешься... мол по какой то причине "падаю" в твоем "рейтинге"
-
> Slym © (02.09.08 13:21) [6]
Ни в коем разе)
Даже наоборот - в "пацанском" рейтинге Автора ты им поднят до высокого звания "чувака", а это дорогого стоит, особенно когда "выше")
-
После.
> Button3 тобой нажимается ПОСЛЕ того как отработает метод > ClientSocket1Connect или ДО ?
-
Да, оттуда. > Slym © > Эта логика содрана либо из http://www.delphimaster.ru/cgi- > bin/http://pda.delphimaster.net/?id=1219864648&n=4 либо из статьи по которой > тот топик писался
-
А зачем вообще что-то сдирать ?
Что мешает творить "с нуля" ?
-
Странные у Вас вопросы Сергей ... А зачем Вы спите ? А зачем Вы едите ? А зачем Вы вообще живете ? А зачем Вы ходите ? Зачем Вы одеваетесь ? Если образно выражаться, все Вы это сдираете, или же хотите сказать, что Вы сами придумали сон, сами придумываете и выращиваете новые культуры картофеля, пшеницы и пр ... Как говорил один человек, и, я склонен ему верить: если человек умный, то он никогда не будет "опускать" тупого, а наоборот будет помогать ему - чтобы привнести свет в его темную голову. И, вместо того чтобы помочь разобраться, дайть дельный совет - Вы просто задаете глупые вопросы.
> Сергей М. © (02.09.08 19:31) [10] > А зачем вообще что-то сдирать ?
А мешает творить с нуля отсутствие знаний необходимых и отсутствие времени на изучение вопроса (на данный момент времени). Как я думал, для этого и существуют тематические форумы - где люди помогают друг-другу, а не поносят слабых и беззащитных.
> Сергей М. © (02.09.08 19:31) [10] > > Что мешает творить "с нуля" ? >
-
Colonel (01.09.08 21:17) procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var j : integer; begin i := ServerSocket1.Socket.ReceiveText; всего навсего убрать жирное :)
-
Огромное Вам человеческое спасибо. Был бы Вам очень признателен, если бы Вы пояснили, почему я так сделал по Вашей подсказке и все заработало ?
И еще вопрос, как мне сделать так, чтобы при возникновении ошибки у меня не вылетали окошки, а ошибка эта отображалась в статус баре ? Как я понимаю, здесь нужно отлавливать исключения, только вот как это сделать ? И какие коды ошибок отлавливать.
Спасибо.
-
ServerSocket1.Socket - cлушающий сокет и его роль только слушать и ацептить соединение в другой сокет который procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); им и следуе пользоваться для чтения/записи
Colonel (03.09.08 6:05) [13] не вылетали окошки procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
ErrorCode:=0;-ошибка не вылезет... НО! под отладчиком ты ее всеравно увидишь
-
Дополнение к протоколу: 1. добавь команду - ? или help и в ответ верни список команд 2. увы с телнетом твоя прога работать не будет, т.к. ввод посимвольный, а ты ввод не накапливаешь 3. if i = 'status' then - сделай раньше For j := 0 to ...
-
Тоже не спите по ночам ))) Нет, мне как раз нужно отлавливать ошибки, т.е, если я правильно Вас понял, то если я поставлю ErrorCode := 0 - то не будут появляться системные окна с ошибками, но, как мне передать саму ошибку и ее текст в статус бар тогда ?
> ErrorCode:=0;-ошибка не вылезет... НО! под отладчиком ты > ее всеравно увидишь
А это к чему - 1 пункт? Хм ... По поводу телнета вообще не думал, просто пытаюсь решить одну проблему с подвисанием удаленной машины, вот и решил попробовать с написания проги подобной. А в 3 пункте зачем ставить цикл ?
> Дополнение к протоколу: > 1. добавь команду - ? или help > и в ответ верни список команд > 2. увы с телнетом твоя прога работать не будет, т.к. ввод > посимвольный, а ты ввод не накапливаешь > 3. if i = 'status' then - сделай раньше For j := 0 to .. > .
Спасибо за помощь. Очень мне помогли Ваши советы.
-
И еще такой вопрос, если на удаленный комп я посылаю logoff, программа перестает работать или же я смогу опять подключиться к ней ? Если она работает, то я так понимаю, что мне нужно удаленно залогиниться, как мне это сделать ?
Спасибо.
-
> программа перестает работать или же я смогу опять подключиться > к ней ?
Перестает.
> мне нужно удаленно залогиниться, как мне это сделать
К Сетям это отношения не имеет.
p.s. Вникни в [15] п.2
-
Colonel (03.09.08 7:51) [17] Сервис напиши... Colonel (03.09.08 7:31) [16] с подвисанием удаленной машины :) а как она перегрузится есле она висит? не лучше найти и устранить причину подвисания?
|