Форум: "Сети";
Текущий архив: 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.49 MB
Время: 0.011 c