Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.31;
Скачать: CL | DM;

Вниз

Помогите с indy 9   Найти похожие ветки 

 
daxter ©   (2009-04-19 22:29) [0]

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

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


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 не срабатывает а возвращается к первой строке "эта строка" не срабатывает и сообщение после нее не выводится. выводится несколько раз подряд "Пришел пакет заголовок...". Что странно при отладке в среде вроде работает. Вобщем объяснить тяжело, надо компилировать и пробовать. Что можете подсказать? И как вообще исходник для работы с большим числом соединений пригоден?

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


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


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

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

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


 
daxter ©   (2009-04-20 09:38) [2]

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


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


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


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


 
daxter ©   (2009-04-20 10:05) [4]

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


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


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


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


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


 
daxter ©   (2009-04-20 10:31) [6]

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


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


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


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


 
daxter ©   (2009-04-20 10:46) [8]

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

придумал

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


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

>придумал

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


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


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

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

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


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

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


 
Anatoly Podgoretsky ©   (2009-04-20 11:03) [12]


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

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


 
Palladin ©   (2009-04-20 11:08) [13]

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


 
daxter ©   (2009-04-20 11:11) [14]

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


 
Anatoly Podgoretsky ©   (2009-04-20 11:18) [15]

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

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


 
daxter ©   (2009-04-20 11:22) [16]

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


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


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


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


 
Palladin ©   (2009-04-20 11:31) [18]


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

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


 
daxter ©   (2009-04-20 11:37) [19]

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

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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2009.05.31;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.016 c
4-1210452824
sargast
2008-05-11 00:53
2009.05.31
Pipe


2-1239866502
vanwan
2009-04-16 11:21
2009.05.31
TListBox + TButton


8-1194437854
zvukoff
2007-11-07 15:17
2009.05.31
как снять звук с микрофона и тут же его выводить на колонки


11-1201248747
Bytes
2008-01-25 11:12
2009.05.31
не могу запустить проект


3-1222062150
Юрий Катунов
2008-09-22 09:42
2009.05.31
Сортировка в DBGrid