Конференция "Сети" » Проблема с приложением клиент-сервер [D7, WinXP]
 
  • Colonel (01.09.08 21:17) [0]
    Доброго всем времени суток,

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

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

    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. Как это можно исправить ? В чем проблема ?

    Спасибо огромное за помощь.
  • Сергей М. © (02.09.08 09:11) [1]
    Button3 тобой нажимается ПОСЛЕ того как отработает метод ClientSocket1Connect или ДО ?
  • Сергей М. © (02.09.08 09:22) [2]

    > 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.');


    Вот эта логика мне вообще не понятна.

    Один из активных клиентов спросил у сервера "Покажи мне свой свой статус", а сервер получив запрос начинает рассылать свой статус всем кому угодно, только не тому кто его запросил ..
  • Slym © (02.09.08 11:49) [3]
    Сергей М. ©   (02.09.08 9:22) [2]
    Вот эта логика мне вообще не понятна.

    Эта логика содрана либо из http://pda.delphimaster.net/?id=1219864648&n=4 либо из статьи по которой тот топик писался
  • Slym © (02.09.08 11:50) [4]
    Сергей М. ©   (02.09.08 9:22) [2]
    И кстати я не понял почему я стал ниже?
  • Сергей М. © (02.09.08 12:27) [5]

    > Slym ©   (02.09.08 11:50) [4]


    > почему я стал ниже?


    Ну на момент [19]-го поста, где ты был окрещен "чуваком выше", твой пост, где ты сказал про "у меня все работает" и на который сослался автор, действительно был выше по тексту топика)
  • Slym © (02.09.08 13:21) [6]
    Сергей М. ©   (02.09.08 12:27) [5]
    а я подумал что ты меня обидеть пытаешься... мол по какой то причине "падаю" в твоем "рейтинге"
  • Сергей М. © (02.09.08 13:36) [7]

    > Slym ©   (02.09.08 13:21) [6]


    Ни в коем разе)

    Даже наоборот - в "пацанском" рейтинге Автора ты им поднят до высокого звания "чувака", а это дорогого стоит, особенно когда "выше")
  • Colonel (02.09.08 19:10) [8]
    После.

    > Button3 тобой нажимается ПОСЛЕ того как отработает метод
    > ClientSocket1Connect или ДО ?
  • Colonel (02.09.08 19:11) [9]
    Да, оттуда.

    > Slym ©
    > Эта логика содрана либо из http://www.delphimaster.ru/cgi-
    > bin/http://pda.delphimaster.net/?id=1219864648&n=4 либо из статьи по которой
    > тот топик писался
  • Сергей М. © (02.09.08 19:31) [10]
    А зачем вообще что-то сдирать ?

    Что мешает творить "с нуля" ?
  • Colonel (03.09.08 00:44) [11]
    Странные у Вас вопросы Сергей ... А зачем Вы спите ? А зачем Вы едите ? А зачем Вы вообще живете ? А зачем Вы ходите ? Зачем Вы одеваетесь ? Если образно выражаться, все Вы это сдираете, или же хотите сказать, что Вы сами придумали сон, сами придумываете и выращиваете новые культуры картофеля, пшеницы и пр ... Как говорил один человек, и, я склонен ему верить: если человек умный, то он никогда не будет "опускать" тупого, а наоборот будет помогать ему - чтобы привнести свет в его темную голову. И, вместо того чтобы помочь разобраться, дайть дельный совет - Вы просто задаете глупые вопросы.

    > Сергей М. ©   (02.09.08 19:31) [10]
    > А зачем вообще что-то сдирать ?


    А мешает творить с нуля отсутствие знаний необходимых и отсутствие времени на изучение вопроса (на данный момент времени). Как я думал, для этого и существуют тематические форумы - где люди помогают друг-другу, а не поносят слабых и беззащитных.

    > Сергей М. ©   (02.09.08 19:31) [10]
    >
    > Что мешает творить "с нуля" ?
    >
  • Slym © (03.09.08 04:47) [12]
    Colonel   (01.09.08 21:17)
    procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
    Socket: TCustomWinSocket);
    var
    j : integer;
    begin
    i := ServerSocket1.Socket.ReceiveText;

    всего навсего убрать жирное :)
  • Colonel (03.09.08 06:05) [13]
    Огромное Вам человеческое спасибо. Был бы Вам очень признателен, если бы Вы пояснили, почему я так сделал по Вашей подсказке и все заработало ?

    И еще вопрос, как мне сделать так, чтобы при возникновении ошибки у меня не вылетали окошки, а ошибка эта отображалась в статус баре ? Как я понимаю, здесь нужно отлавливать исключения, только вот как это сделать ? И какие коды ошибок отлавливать.

    Спасибо.
  • Slym © (03.09.08 06:44) [14]
    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;-ошибка не вылезет... НО! под отладчиком ты ее всеравно увидишь
  • Slym © (03.09.08 06:52) [15]
    Дополнение к протоколу:
    1. добавь команду - ? или help
    и в ответ верни список команд
    2. увы с телнетом твоя прога работать не будет, т.к. ввод посимвольный, а ты ввод не накапливаешь
    3. if i = 'status' then - сделай раньше For j := 0 to ...
  • Colonel (03.09.08 07:31) [16]
    Тоже не спите по ночам ))) Нет, мне как раз нужно отлавливать ошибки, т.е, если я правильно Вас понял, то если я поставлю ErrorCode := 0 - то не будут появляться системные окна с ошибками, но, как мне передать саму ошибку и ее текст в статус бар тогда ?

    > ErrorCode:=0;-ошибка не вылезет... НО! под отладчиком ты
    > ее всеравно увидишь


    А это к чему  - 1 пункт? Хм ... По поводу телнета вообще не думал, просто пытаюсь решить одну проблему с подвисанием удаленной машины, вот и решил попробовать с написания проги подобной. А в 3 пункте зачем ставить цикл ?

    > Дополнение к протоколу:
    > 1. добавь команду - ? или help
    > и в ответ верни список команд
    > 2. увы с телнетом твоя прога работать не будет, т.к. ввод
    > посимвольный, а ты ввод не накапливаешь
    > 3. if i = 'status' then - сделай раньше For j := 0 to ..
    > .


    Спасибо за помощь. Очень мне помогли Ваши советы.
  • Colonel (03.09.08 07:51) [17]
    И еще такой вопрос, если на удаленный комп я посылаю logoff, программа перестает работать или же я смогу опять подключиться к ней ? Если она работает, то я так понимаю, что мне нужно удаленно залогиниться, как мне это сделать ?

    Спасибо.
  • Сергей М. © (03.09.08 08:55) [18]

    > программа перестает работать или же я смогу опять подключиться
    > к ней ?


    Перестает.


    > мне нужно удаленно залогиниться, как мне это сделать


    К Сетям это отношения не имеет.

    p.s.
    Вникни в [15] п.2
  • Slym © (03.09.08 09:29) [19]
    Colonel   (03.09.08 7:51) [17]
    Сервис напиши...
    Colonel   (03.09.08 7:31) [16]
    с подвисанием удаленной машины

    :) а как она перегрузится есле она висит?
    не лучше найти и устранить причину подвисания?
 
Конференция "Сети" » Проблема с приложением клиент-сервер [D7, WinXP]
Есть новые Нет новых   [134432   +19][b:0][p:0.003]