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

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

Помогите с indy 9 [D7, WinXP]


daxter ©   (2009-04-19 22:29:00) 

Здравствуйте мастера.

Есть такой код (часть кода). Сервер чата.


procedure TFormServer.TCPServerExecute(AThread: TIdPeerThread);
var
 Zagolovok : TZagolovok;
 Buffer    : array [0..10000] of char;
begin
 try
   while AThread.Connection.Connected do
   begin
     AThread.Connection.ReadBuffer(Zagolovok, SizeOf(Zagolovok)); // первая строка
     MemoLog.Lines.Add('Пришел пакет заголовок...');
     MemoLog.Lines.Add('ID - '+IntToStr(Zagolovok.ID));
     MemoLog.Lines.Add('Comm - '+IntToStr(Zagolovok.Comm));
     MemoLog.Lines.Add('Size - '+IntToStr(Zagolovok.Size));
     AThread.Connection.ReadBuffer(Buffer, Zagolovok.Size); // эта строка
     MemoLog.Lines.Add('Пришел основной пакет...');
     case Zagolovok.Comm of
         1: Begin MemoLog.Lines.Add('Буду проверять логин...'); ProveritLogin(AThread, @Buffer); end;
        50: Begin MemoLog.Lines.Add('Разошлю всем сообщение...'); PrishloMsg(AThread, @Buffer); end;
     end;
   end;
 except
   on E: Exception do
     ;//MemoLog.Lines.Add('Типа ошибка... '+E.Message);
 end;
end;


Полные исходники сервера и клиента здесь (не доделанные, но рабочие) http://slil.ru/27465268

Проблема в следующем. При запуске сервера и клиента на одном компьютере все ништяк. Даже если клиентов запускать много. Но если клиента запускаю на другом компе в локальной сети, то такая ситуация: Клиент подключается, но при отправке    
информации о клиенте, сервер заголовок сообщения принимает нормально, а вот следующий ReadBuffer не срабатывает а возвращается к первой строке "эта строка" не срабатывает и сообщение после нее не выводится. выводится несколько раз подряд 'Пришел пакет заголовок...'. Что странно при отладке в среде вроде работает. Вобщем объяснить тяжело, надо компилировать и пробовать. Что можете подсказать? И как вообще исходник для работы с большим числом соединений пригоден?

Заранее спасибо.


Palladin   (2009-04-20 11:47:00) [1]

ты прав, с такими вопросами и отношением к отвечающим тебе на форум к кашпировским


daxter   (2009-04-20 11:37:00) [2]

спасибо за внимание.

тем круче быдлокодерприятно познакомится.

тема закрыта. я не туда попал.


Palladin   (2009-04-20 11:31:00) [3]


> Глаза разуй - [7]

чем сильней обуты глаза - тем круче быдлокодер :)


Сергей М.   (2009-04-20 11:30:00) [4]


> не видел ни одного совета


Глаза разуй - [7]


daxter   (2009-04-20 11:22:00) [5]

я не видел ни одного совета, кроме убрать обращения к VCL объектам


Anatoly Podgoretsky   (2009-04-20 11:18:00) [6]

> daxter  (20.04.2009 11:11:14)  [14]

Знатоки оценили степень извращения и нежелание автора прислушиваться к советом, нафига же тогда бисер метать?


daxter   (2009-04-20 11:11:00) [7]

спасибо за советы, я понял, знатоков много, а мастеров нет


Palladin   (2009-04-20 11:08:00) [8]

а названия, названия то какие экзотические :) zagolovok :))


Anatoly Podgoretsky   (2009-04-20 11:03:00) [9]


> daxter ©   (20.04.09 10:46) [8]

Чего только русский программист не придумает, лишь бы не работать.


daxter   (2009-04-20 10:55:00) [10]

на самом деле да ошибки возможны. лучше как было, последовательно. пришел заголовок, сразу получил буфер


daxter   (2009-04-20 10:54:00) [11]

а там на самом деле уже buffer от клиента в это время пришел

а куда же заголовок делся. от клинета сначала заголовок отправляется а потом буфер. или они в дороге могли местами поменяться


Медвежонок Пятачок   (2009-04-20 10:49:00) [12]

>придумал

например перед первым чтением из сокета проверять Zagolovok е


ага. придумал. читаешь SizeOf(Zagolovok)), а там на самом деле уже buffer от клиента в это время пришел.
выбрасываешь его и ждешь буфер, а клиент там снова заголовок отправил.
и так далее......


daxter   (2009-04-20 10:46:00) [13]

видимо прийдется по другому организовывать чтение из сокета

придумал

например перед первым чтением из сокета проверять Zagolovok если он заполнен, то прочитать из сокета в буфер Size байт и очистить Zagolovok, если не заполнен то ждем из сокета заголовок. Вроде так должно быть нормально


Сергей М.   (2009-04-20 10:36:00) [14]


> "эта строка" не срабатывает и сообщение после нее не выводится


Значит при выполнении ReadBuffer возникает искл.ситуация.


daxter   (2009-04-20 10:31:00) [15]

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


Сергей М.   (2009-04-20 10:16:00) [16]


> понятно, но к теме не относится


Вот сначала устрани грубуюошибку, потом будет и по теме.


daxter   (2009-04-20 10:05:00) [17]

Начнем с того, что обработчик OnExecute выполняется в контексте дополнительного потока.
Обращение в контексте доп.потока к виз.VCL-контролам недопустимо.


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


Сергей М.   (2009-04-20 09:44:00) [18]


> daxter ©   (20.04.09 09:38) [2]


Начнем с того, что обработчик OnExecute выполняется в контексте дополнительногопотока.
Обращение в контексте доп.потока к виз.VCL-контролам недопустимо.


daxter   (2009-04-20 09:38:00) [19]

Скорость это понятно, но почему второй ReadBuffer не срабатывает, а возвращается к первому. У indy на сколько я знаю блокирующие сокеты, а значит они должны ждать из сети данных. Или я не прав.


Германн   (2009-04-20 01:23:00) [20]


> При запуске сервера и клиента на одном компьютере все ништяк.
>  Даже если клиентов запускать много. Но если клиента запускаю
> на другом компе в локальной сети, то такая ситуация: Клиент
> подключается, но при отправке    
> информации о клиенте, сервер заголовок сообщения принимает
> нормально, а вот следующий ReadBuffer не срабатывает а возвращается
> к первой строке "эта строка" не срабатывает и сообщение
> после нее не выводится. выводится несколько раз подряд 'Пришел
> пакет заголовок...'. Что странно при отладке в среде вроде
> работает.

Да собственно ничего странного. Времена/скорости разные. На локальном компьютере всё делается быстро, а в сети заметно медленнее. Под отладчиком всё нормально работает именно по этой же причине.

Дальнейшее к тем кто знает Инди. Я с ней никогда не работал. Как и вообще не работал синхронно с ТСР.


Наверх

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