Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.05.31;
Скачать: [xml.tar.bz2];

Вниз

Помогите с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.005 c
15-1237966822
Немо
2009-03-25 10:40
2009.05.31
Как воевал - с_порно, как надо?


2-1239701746
mnj
2009-04-14 13:35
2009.05.31
Распознавание Sender


2-1239404205
NVMZ
2009-04-11 02:56
2009.05.31
Изменения размеров формы


11-1201031180
AndreyUT
2008-01-22 22:46
2009.05.31
Определить когда курсор покинул ссылку в richedit


2-1239704891
Franzy
2009-04-14 14:28
2009.05.31
Raise





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский