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

Вниз

Пропадалово   Найти похожие ветки 

 
Steel Ice   (2002-05-02 01:31) [0]

Обнаружил прегрустнейшую вещчь.
Соединяюсь TClientSocket с TServerSocket.
Делаю ClientSocket.Socket.SendBuf(buf,len); Соответсвенна получаю на TServerSocket событие OnClientRead() все класс, все работает.
НО!
Если я отправлю допустим 20 пакетов с Client"a подряд, то дойти может 18. (Раз на раз не приходица, бывает процесс пропаданий больше, бывает меньше). Причем если отправлять "медленно" ну скажем одна отправка в 5 секунд, то более менее стабильно, но стоит поднять скорость раз в секунду - все. Причем комп в одной сетке 10Мбит. Тобишь не от сети зависит. А если с плохого канала - то ваще аут, жуткие пропадалова. Пробовал на разных виндах, на разных сетях. Написал специальный тестер.
Но результат один - с клиента было 150 отправок - сервер зарегистрировал только 120 событий OnClientRead()

Вопрос: ЧТО ДЕЛАТЬ??!! Как избежать пропаданий?! Вроде ТСР, защита от такого типа глюков а фсеравно :(((


 
Malder   (2002-05-02 13:49) [1]

Steel Ice, эх. А ты проверял сам текст который дошел ?
Дело в том, что маленькие сообщения могут объединяться. То есть, ты посылаешь 20 пакетов, а доходит 15 только. Но не означает, что пакеты потерялись, просто 5 пакетов находится внутри других. Ну вот объясню на примере:
Ты посылаешь сначала "Привет", а потом "Друзья". Они могу объединиться и будет доставлен один пакет c текстом "ПриветДрузья". И событие OnClientRead возникнет только один раз. Соответственно, чем медленее сеть, тем больше пакетов будут пытаться переслать сразу.
Вот и все объяснение...

P.S. Проверь, какой именно текст доходит до тебя. И скажи сюда, а то мне тоже нтересно =)


 
cyborg   (2002-05-02 16:07) [2]

Видимо у меня та же проблема при одновременном отключении нескольких клиентов:
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1020102651&n=4

Может кто знает счто делать в таком случае?


 
Steel Ice   (2002-05-02 20:36) [3]

Значит вот что показали исследования:
действительно, как и говорил Малдер - сообщения просто наслаиваюца! :)
Тобишь когда я сделал контроль на РАЗМЕР отправленых и полученных БАЙТ (а не пактоф) то вроде цыфорки пока совпадают. Знач это наверно шухер лишний я натворил. Правда приходица делать разделение, но это лучше чем пропадания.

Киборг: Это решаеца просто. Надо гасить ошыпку. Я сам чат дописываю. Это ужо поборол. Самое сложное это передача Длинных (длинее чем 2000 буковок) строк. И структур.


В обещм всем спасибо, всем удачи, я побег дальше мучаца ;)


 
Malder   (2002-05-02 21:02) [4]

Steel Ice, cyborg вы видно неправильно представляете себе архитектуру построения сетевых приложений. Допустим чат. Там все основано на сообщениях. То есть послали сообщение - вывели на экран. Возникает вопрос, а как разделить сообщения друг от друга. Вроде бы один OnClientRead - одно сообщение. Но это не всегда выполняется, сообщения могут наслаиваться. Поэтому в самом тексте должно быть разделение. Допустим после каждого сообщения идет уникальный ключ. Ну вот у меня был просто чат и там ключом был символ"|". То есть встретив его программа узнавала, что это конец сообщения. И если в пришедшем пакете два символа "|", то значит пришло сразу два сообщения. Именно таким образом нужно организовывать работу...


 
cyborg   (2002-05-02 22:00) [5]

>Steel Ice
>Надо гасить ошыпку.
имеется ввиду ErrorCode:=0; ?

Если не трудно, скажи что и как ты поборол?

При отключении клиента, сервер оповещает всех об отключении, мне интересно, как ты это реализовал?


 
Malder   (2002-05-03 12:03) [6]

cyborg, а что здесь сложного ? Перебираешь всех подключенных, и пищещь им что такой то клиент отключился...


 
Steel Ice   (2002-05-03 17:10) [7]

2Малдер: Твой способ подходит для оч простого чата. У меня он не такой. Там символ | может встретица когда угодно. Сообщения то шифруюца, и в каждом сообщениии заголовок - 31 байт служебной информации (идентификатор чатланина, n-байтный код для аутентификации и невозможности подделки идентификатора, идентификатор сообщения (могут быть сообщения разногло типа: просто сообщение, приват, напев) потом цвета ников и сообщений).
Так-же в этом чате присудствует "магазин", где за очки ("деньги") полученные от общения и проч. можно покупать навороты к чату (например просмотр логов в чате).
Так-же каждое сообщение содержит админскую информацию, для админов сообщения имеют другой характер. Ведь админы могут удалять сообщения. Кстати, удаление сообщений можно покупать.

Так что проект немаленький. Он уже работает. Только в демке, пока в нем общаюца до 15ти чел - все ок, но просто вот начались пропадания. Вот я и обратилси.

За примером веб-версии чата, можно обратица сюды: http://rulezchat.dp.ua - это то-же самое, только имеет web-интерфейс. Сейчас вот делаю win32 версию. Она быстрее и больше возможностей. Люди тестировавшие эту демку - остались оч довольны. И жутко меня торопят. :(

И никакой особый символ туда не впихнешь. Я сделал как протокол cisco"вкого RADIUS-сообщений. Просто в начале есть длинна пакета, он обрабатываеца, вырезаеца, а то что остаеца - снова обрабатываеца, и так пока есть что обрабатывать :)


 
cyborg   (2002-05-03 17:23) [8]

Malder, сложно то, что при одновременном отключении нескольких сокетов, отправляя всем сообщение что кто-то вырубился происходит ошибка, при ошибке опять вызывается событие отключения, в этом событии опять всем отправляется мессага об отключении, затем опять ошибка и т.д. Вот в чем проблема то! Я и спрашиваю, как можно обойти это дело, конкретнее, как перед отправкой сокету проверить что он отключён? При проверке он уже отключён и вылазит ошибка и ............ короче круговорот :-)

Похоже вы не поняли мою проблему :-\

Steel Ice попробуй у себя запустить несколько клиентов и закрыть группу этих программ, что у тебя будет? Я думаю если у тебя то же идёт рассылка всем мессаг, что кто-то вырубился получится такая фигня, а если не вылазит, скажи пожалуйста как ты это сделал.


 
Malder   (2002-05-03 22:42) [9]

cyborg, если Active=false - значит сокет отключен...

Steel Ice, блин, ну не надо все воспринимать буквально. Насчет "|" я тебе просто так сказал. Делай выводы. В качестве разделителя можно использовать код перевода строки. Например, в IRC так и делается. А IRC используют миллионы человек...


 
cyborg   (2002-05-03 23:15) [10]

У ServerSocket1.Socket.Connections[I] Active НЕТ!


 
Malder   (2002-05-04 13:32) [11]

cyborg, ну может быть. Тогда обрабатывай отключение в OnDisconnect или как там...
В ОнДисконект рассылай всем оставшимся сокетам сообщения, что данный сокет кирдык =)


 
Steel Ice   (2002-05-05 19:12) [12]

Код перевода строки. Тобишь #13#10
А какая гарантия, что такой код не встретица в сообщении? Ведь в сообщении можно делать перевод строки.
Нет, никакой код тут не подойдет. Я решил проблему через заголовки. Это надежнее.
я же сказал АБСОЛЮТНО ЛЮБОЙ код может встретица ГДЕ УГОДНО!!! ведь сообщения шифруюца!!!! и оно превращаеца в абрукатабру. Почитай внимательнее то мое сообщение.
Я не собираюсь делать IRC. И у нее слишком примитивный вид общения. Я собираюсь делать почти то-же, только намного объемнее.

2Киборг:
Server.socket.activeconnections - количство подключеных, тобишь хочешь узнать, активно ли скажем ServerSocket1.Socket.Connections[5] или нет - смотришь колво активных, если оно меньше 5ти, то следовательно неактивно ;)

У меня не идет ошибки, у меня гасяца все ошибки нафик в OnError я делаю ErrorCode:=0;
и фсе.


 
Malder   (2002-05-06 12:08) [13]

Steel Ice, хм. Непосредственно сообщения обрамляются в кавычки. И внутри кавычек пробелы за отделители сообщений не считаются.
Насчет примитивности IRC. Просто очень самоуверенное высказывание. Протокол разрабатывался ОЧЕНЬ НЕ ГЛУПЫМИ ЛЮДЬМИ с 1993 года ! Прошло более 8 лет. За 8 лет они придумали примитивный протокол ?! Да ты почитай RFC 1459... особенно какую-нибудь линковку серверов...


 
cyborg   (2002-05-08 06:28) [14]

Malder, об этом и речь :-), при событии ondisconnect рассылается и такой круговорот получается.



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

Форум: "Сети";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.018 c
3-47075
EugeneCher
2002-06-19 16:28
2002.07.15
IBQuery проблема с текстовыми вычисляемыми полями!


1-47297
how to make
2002-06-30 21:00
2002.07.15
Помагите пожалуйста как например из одного екзе выделить другой и


1-47498
race1
2002-07-04 12:47
2002.07.15
procedure


14-47759
Феминистка
2002-05-25 13:17
2002.07.15
Мужики


14-47719
Yuri Btr
2002-06-11 14:28
2002.07.15
Проблема WinXP и дисков





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский