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

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

Почему сообщения отсылаются не попорядку?... =((( [D7, WinXP]


Страницы:   1 2

Andrewtitoff ©   (2008-02-14 22:31:00) 

Здравствуйте!, я использую пару клиент-сервер для реализации чего то вроди чата с расширенныли функциями

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

......
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 : Конец-------------------------------


Сергей М.   (2008-02-21 20:24:00) [1]


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


Аминь.


Andrewtitoff   (2008-02-21 18:12:00) [2]

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


Сергей М.   (2008-02-21 13:26:00) [3]


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


Это ты сам придумал или кто подсказал ?)
Чем тебе одно-единственное соединение для этой цели не угодило ?


Andrewtitoff   (2008-02-21 10:41:00) [4]

Ну я в самом начале приводил часть процедуры, которая по команде DIR каждый findnext отправляла в новом соединении...  =)))


Сергей М.   (2008-02-21 10:16:00) [5]


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


Смотря насколько часто)


Andrewtitoff   (2008-02-21 10:11:00) [6]

Ясно..,спасобо,  ну да, тож верно...  =)))

А ччто кстати, как я понял очень часто соединяться - разъединяться нельзя?, после совета Slym-а я исполнение команды 'DIR' засунул в одно соединение и она замечательно заработала, а так же вся программа в целом перестала подвисать! =)))


Сергей М.   (2008-02-21 10:09:00) [7]


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


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

Т.е. таймер не "тикнет" до тех пор, пока то самое "какое либо файло" не будет передано/принято


Сергей М.   (2008-02-21 09:59:00) [8]


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


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

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

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

По поводу [28] - это "классика жанра". Но эта "классика" применима лишь послеуспешной установки соединения.


Andrewtitoff   (2008-02-21 09:17:00) [9]

2 Сергей М.
Да не я не про то..., я хучу себе в на форму налепить какую нить надпись типе "Remote server Listening",  фон которой бы менялся с красного на зеленый цвета в зависимости от того слушает ли порт, используемый мною удаленный сервер или нет...

2 Slym
Эх..., ну это понятно, просто я думал может есть какой изошъренный способ, просто конесно не проблема засунуть в таймер "Ты спишь? - я сплю!", а не повлияет ли это на работу самой программы, например когда она будет принимать или отсылать какое либо файло?, можно ли это как нибудь грамотно реализовать что бы одно другому не мешало, или лучше не заморачиваться с этими наворотами?


Slym   (2008-02-21 06:15:00) [10]

-Ты спишь?
-Да, сплю!

аналогично и в сетях :)


Сергей М.   (2008-02-20 23:30:00) [11]


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


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

Между прочим, отладчик как раз и придуман для некоего рода "отследователей")


Andrewtitoff   (2008-02-20 23:18:00) [12]

2 Сергей М.

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

2 All

Неужели ни кто не может подсказать?


Сергей М.   (2008-02-20 21:01:00) [13]

Отслеживают, вообще-то, шпионов и предателей, иногда неплательщиков)
Потом их ловят, судят, сажают-вешают-расстреливают)
А иногда меняют на других "отслеженных")

Ты, чудо, хоть что-нить про встроенный в Делфи отладчик слыхал ?)


Andrewtitoff   (2008-02-20 18:49:00) [14]

Подскажите пожалуйста, а как можно отслеживать, слушает ли удаленный сервер порт? (порт и естественно хост заранее известен)


Slym   (2008-02-18 04:50:00) [15]

я не понял... у нас какай компанента? TTraySocketServer? давай попорядку и не мешай GUI с ядром


Сергей М.   (2008-02-17 20:42:00) [16]


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


С помощью отладчика, вестимо)


Andrewtitoff   (2008-02-15 19:28:00) [17]

Ну это я его делаю неактивным при выходе из программы, потому что когда он активный - иконка остается после закрытия программы пока на нее не наведешь указателем мыши... =)))

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

Да, это форма на которой пара клиент-сервер (как в примере Chat в седьмой дельфе только перерделанная мною на TcpClient&TcpServer), т.е. у меня только одна форма и я запускаю одну и ту же прогу в двух экземплярах только ввожу IP-шники и порты...


Сергей М.   (2008-02-15 15:25:00) [18]


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


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

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

Что вообще такое TMyChat ? Это класс некоей формы ? Формы какого приложения - приложения-клиента или приложения-сервера ?


Andrewtitoff   (2008-02-15 15:21:00) [19]

Чегото я недопонимаю, а почему он неактивен, текст то он принимает....

Возникает на выходе из программы, там в oncloce только TrayIcon1.Visible:=false; стоит...


Сергей М.   (2008-02-15 14:39:00) [20]


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


Ошибка, вероятно, возникает при вызове Shell_NotifyIcon() ?


Страницы:   1 2

Наверх

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