![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с 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 не срабатывает а возвращается
> к первой строке "эта строка" не срабатывает и сообщение
> после нее не выводится. выводится несколько раз подряд 'Пришел
> пакет заголовок...'. Что странно при отладке в среде вроде
> работает.
Да собственно ничего странного. Времена/скорости разные. На локальном компьютере всё делается быстро, а в сети заметно медленнее. Под отладчиком всё нормально работает именно по этой же причине.
Дальнейшее к тем кто знает Инди. Я с ней никогда не работал. Как и вообще не работал синхронно с ТСР.