Конференция "Сети" » Почему сообщения отсылаются не попорядку?... =((( [D7, WinXP]
 
  • Andrewtitoff © (14.02.08 22:31) [0]
    Здравствуйте!, я использую пару клиент-сервер для реализации чего то вроди чата с расширенныли функциями

    Вот часть кода:

    ......
    procedure TMyChat.SendCommand(s:string);
    begin
    TcpClient1.Active := True;
     try
       if TcpClient1.Connect then
         begin
         TcpClient1.Sendln(s);
         Edit.Clear;
         end;
     finally
       TcpClient1.Disconnect;
     end;
    end;
    .............
    procedure TMyChat.Button1Click(Sender: TObject);
    var
    c : boolean;
    begin
    Display.Lines.Add(Edit.Text);
    ........
    if UpperCase(Edit.Text) ='DIR' then
    Begin
    SendCommand('Command : DIR');
    c:=true;
    end;
    ..........
    procedure TMyChat.TcpServer1Accept(Sender: TObject;
     ClientSocket: TCustomIpClient);
    var
    .......
    begin
    try
    CurrentCommand:=ClientSocket.Receiveln;
    Display.Lines.Add('Server : '+CurrentCommand);
    .........
    if CurrentCommand='Command : DIR' then
    begin
       GetDir(0,CurrentDir);
       SEndCommand('Директория : '+CurrentDir);
       SEndCommand('-------------------------------------');
      if FindFirst(CurrentDir + '\*.*', faAnyFile, tt) = 0 then
      begin
        repeat
          if tt.Attr = faDirectory then
          SendCommand('[DIR]'+tt.Name)else
          SendCommand(tt.Name+' [Size : '+inttostr(tt.SIZE)+']');
        until FindNext(tt) <> 0;
        FindClose(tt);
      end;
       SEndCommand('Конец-------------------------------');
    end;
    ......
    except
      on E:Exception do
      begin
        if ClientSocket.Connected then
          ClientSocket.Sendln('-ERR Raised exception with message: '+E.Message)
        else
          raise;
      end;
    end;
    CurrentCommand:='';
    end;




    а получается иногда нормально, но чаще байда на пример такая:

    dir
    Server : Директория : C:\Documents and Settings\Felix\Рабочий стол\EXT_New !!!_My_Chat_TcpServer&TcpClient
    Server : My_Chat.dpr [Size : 238]
    Server : [DIR]..
    Server : [DIR].
    Server : -------------------------------------
    Server : My_Chat.dproj [Size : 3054]
    Server : My_Chat.dproj.local [Size : 1850]
    Server : My_Chat.exe [Size : 494080]
    Server : My_Chat.identcache [Size : 199]
    Server : My_Chat.res [Size : 5280]
    Server : My_Chat_.dcu [Size : 19486]
    Server : My_Chat_.dfm [Size : 2279]
    Server : My_Chat_.pas [Size : 8260]
    Server : Конец-------------------------------
  • ketmar © (14.02.08 22:37) [1]
    ну, не делай «байды».

    собственно — а что не так? (помимо неверной работы с FindXXX)

    ---
    Understanding is not required. Only obedience.
  • Andrewtitoff © (14.02.08 22:44) [2]
    2 ketmar
    Сообщения выводятся не в том порядке, в котором я их отправляю...
    А что не так с FindXXX?
  • ketmar © (15.02.08 02:51) [3]
    >[2] Andrewtitoff © (2008-02-14 22:44:00)
    порядок даже не пытался ачмоиовать.

    п с финдом… хэдп читал? я вижу, что нет.

    ---
    Understanding is not required. Only obedience.
  • ketmar © (15.02.08 02:52) [4]
    тьфу!

    ---
    Understanding is not required. Only obedience.
  • Slym © (15.02.08 06:10) [5]
    Andrewtitoff ©   (14.02.08 22:31)
    SendCommand

    Ты забыл добавить что долго отправляет/принамает еще...
    твой SendCommand обрывает соединение
    finally
      TcpClient1.Disconnect;
    end;


    и отправка идет в несколько соединений, а тут порядок никто не гарантирует!
    если заменить SendCommand на TcpClient1.Sendln все должно работать
  • Slym © (15.02.08 06:11) [6]
    Slym ©   (15.02.08 6:10) [5]
    TcpClient1.Sendln

    ClientSocket.Sendln
  • Сергей М. © (15.02.08 09:23) [7]

    > Display.Lines.Add(


    Я не перестаю удивляться, как тебе нравится раз за разом получать одними и теми же граблями по одному и тому же лбу).. Мазохист ?)

    Ты уже раза 3-4 приводил фрагменты своих обработчиков OnAccept, всякий раз тебе было сказано о недопустимости обращений к визуальным VCL-контролам в обработчике этого события, но ты по-прежнему делаешь одну и ту же упомянутую грубую ошибку)
  • Andrewtitoff © (15.02.08 10:13) [8]
    2 Сергей М.
    Ну вроде работает...
    А как выводить информацию тогда, мне же так никто и не сказал..., кстати за основу этой проги взят пример из седьмой дельфи (Chat)...
  • Сергей М. © (15.02.08 10:21) [9]

    > Ну вроде работает


    Рано или поздно настанет "судный день" - в этот день ты обязательно получишь исключением (например, "canvas doesn't allow drawing") по лбу)


    > как выводить информацию


    Зачем ее выводить ? Для протокола что ли ?


    > за основу этой проги взят пример из седьмой дельфи (Chat)


    Там совсем другие компоненты использованы.
  • Andrewtitoff © (15.02.08 10:28) [10]
    2 Сергей М.

    >Зачем ее выводить ? Для протокола что ли ?

    Ну это типа терминала, там мне нужно отправлять туда и обратно файло, как я без вывода информации то это делать буду, тем более я же привел одну из процедур (DIR), как я еще без вывода узнаю о содержимом удаленного винта?...
  • Сергей М. © (15.02.08 10:43) [11]

    > Andrewtitoff ©   (15.02.08 10:28) [10]


    Понятно.

    Но в любом случае вывод инф-ции в визуальный VCL-контрол следует выполнять в основном потоке приложения.
  • Andrewtitoff © (15.02.08 11:10) [12]
    Ясно, тут кстати вылезла еще одна проблемка, когда я пытаюсь переслать файл как я понял с системными атрибутами (с:\autorun.exe) то выскакивает ошибка Socket Error 10061, она кстати выскакивает периодически в процедуре DIR на удаленном конце при просмотре корня...
  • Andrewtitoff © (15.02.08 11:25) [13]
    Может это все брандмауэр виндовсовский?...
  • Сергей М. © (15.02.08 14:21) [14]
    Между файловыми атрибутами и упомянутой ошибкой нет никакой связи.
  • Andrewtitoff © (15.02.08 14:27) [15]
    а в чем тогда может быть дело?
  • Andrewtitoff © (15.02.08 14:29) [16]
    Небольшой вопросик не по теме:

    Чем может быть вызвана ошибка "Cannot remove shell notification icon"?
  • Сергей М. © (15.02.08 14:37) [17]
    10061 = WSAECONNREFUSED = The attempt to connect was forcefully rejected = Запрос на соединение (попытка коннекта к заданному порту) отвержен сервером (т.е. указанный клиентом порт сервера на момент попытки коннекта не активен)
  • Сергей М. © (15.02.08 14:39) [18]

    > Andrewtitoff ©   (15.02.08 14:29) [16]


    Ошибка, вероятно, возникает при вызове Shell_NotifyIcon() ?
  • Andrewtitoff © (15.02.08 15:21) [19]
    Чегото я недопонимаю, а почему он неактивен, текст то он принимает....

    Возникает на выходе из программы, там в oncloce только TrayIcon1.Visible:=false; стоит...
  • Сергей М. © (15.02.08 15:25) [20]

    > Andrewtitoff ©   (15.02.08 15:21) [19]


    А мне почем знать, почему он у тебя неактивен ?)

    Я знаю лишь одно - эта ошибка может возникнуть только у клиентского TCP-компонента и только при выполнении метода Connect (или смены св-ва Active c False на True).

    Что вообще такое TMyChat ? Это класс некоей формы ? Формы какого приложения - приложения-клиента или приложения-сервера ?
  • Andrewtitoff © (15.02.08 19:28) [21]
    Ну это я его делаю неактивным при выходе из программы, потому что когда он активный - иконка остается после закрытия программы пока на нее не наведешь указателем мыши... =)))

    Ну значит она возникает при смене св-ва Active в true..., так а в чем причина то?, как это можно исправить?

    Да, это форма на которой пара клиент-сервер (как в примере Chat в седьмой дельфе только перерделанная мною на TcpClient&TcpServer), т.е. у меня только одна форма и я запускаю одну и ту же прогу в двух экземплярах только ввожу IP-шники и порты...
  • Сергей М. © (17.02.08 20:42) [22]

    > как это можно исправить?


    С помощью отладчика, вестимо)
  • Slym © (18.02.08 04:50) [23]
    я не понял... у нас какай компанента? TTraySocketServer? давай попорядку и не мешай GUI с ядром
  • Andrewtitoff © (20.02.08 18:49) [24]
    Подскажите пожалуйста, а как можно отслеживать, слушает ли удаленный сервер порт? (порт и естественно хост заранее известен)
  • Сергей М. © (20.02.08 21:01) [25]
    Отслеживают, вообще-то, шпионов и предателей, иногда неплательщиков)
    Потом их ловят, судят, сажают-вешают-расстреливают)
    А иногда меняют на других "отслеженных")

    Ты, чудо, хоть что-нить про встроенный в Делфи отладчик слыхал ?)
  • Andrewtitoff © (20.02.08 23:18) [26]
    2 Сергей М.

    Слыхал, а при чем тут отладчик?

    2 All

    Неужели ни кто не может подсказать?
  • Сергей М. © (20.02.08 23:30) [27]

    > а при чем тут отладчик?


    А что значит "отслеживать" ?)

    Между прочим, отладчик как раз и придуман для некоего рода "отследователей")
  • Slym © (21.02.08 06:15) [28]
    -Ты спишь?
    -Да, сплю!


    аналогично и в сетях :)
  • Andrewtitoff © (21.02.08 09:17) [29]
    2 Сергей М.
    Да не я не про то..., я хучу себе в на форму налепить какую нить надпись типе "Remote server Listening",  фон которой бы менялся с красного на зеленый цвета в зависимости от того слушает ли порт, используемый мною удаленный сервер или нет...

    2 Slym
    Эх..., ну это понятно, просто я думал может есть какой изошъренный способ, просто конесно не проблема засунуть в таймер "Ты спишь? - я сплю!", а не повлияет ли это на работу самой программы, например когда она будет принимать или отсылать какое либо файло?, можно ли это как нибудь грамотно реализовать что бы одно другому не мешало, или лучше не заморачиваться с этими наворотами?
  • Сергей М. © (21.02.08 09:59) [30]

    > Andrewtitoff ©   (21.02.08 09:17) [29]


    А собссно зачем юзеру знать, активен или неактивен удаленный сервис ?

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

    Собссно иных способов определить активность целевого сервиса и нет. Способы же "грязного хака", применяемые в разного рода шпионских программах а-ля nmap, естественно не рассматриваются как малонадежные и потенциально опасные.

    По поводу [28] - это "классика жанра". Но эта "классика" применима лишь после успешной установки соединения.
  • Сергей М. © (21.02.08 10:09) [31]

    > не повлияет ли это на работу самой программы, например когда
    > она будет принимать или отсылать какое либо файло


    В твоем случае это не то что никак не повлияет - это вообще работать не будет, поскольку ты выбрал блокирующий режим и примитивный протокол инф.обмена.

    Т.е. таймер не "тикнет" до тех пор, пока то самое "какое либо файло" не будет передано/принято
  • Andrewtitoff © (21.02.08 10:11) [32]
    Ясно..,спасобо,  ну да, тож верно...  =)))

    А ччто кстати, как я понял очень часто соединяться - разъединяться нельзя?, после совета Slym-а я исполнение команды 'DIR' засунул в одно соединение и она замечательно заработала, а так же вся программа в целом перестала подвисать! =)))
  • Сергей М. © (21.02.08 10:16) [33]

    > очень часто соединяться - разъединяться нельзя?


    Смотря насколько часто)
  • Andrewtitoff © (21.02.08 10:41) [34]
    Ну я в самом начале приводил часть процедуры, которая по команде DIR каждый findnext отправляла в новом соединении...  =)))
  • Сергей М. © (21.02.08 13:26) [35]

    > каждый findnext отправляла в новом соединении


    Это ты сам придумал или кто подсказал ?)
    Чем тебе одно-единственное соединение для этой цели не угодило ?
  • Andrewtitoff © (21.02.08 18:12) [36]
    ну так получилось...  =))))
  • Сергей М. © (21.02.08 20:24) [37]

    > ну так получилось.


    Аминь.
 
Конференция "Сети" » Почему сообщения отсылаются не попорядку?... =((( [D7, WinXP]
Есть новые Нет новых   [134431   +15][b:0][p:0.002]