Online MUD игра АРДА

Общедоступные => Строительство и программы => Тема начата: aldaril от 09.06.05, 12:05:44

Название: Clear buffer
Отправлено: aldaril от 09.06.05, 12:05:44
Всем магам известна ситуация, когда игрок наспамил кучу кастов и ждет своей участи, в то время, когда пора уносить ноги. Еще более известна эта ситуация для атакеров.

Меня просили (не в этом мире) некоторое время назад сделать возможным очистку своих же раннее веденных команд. Наконец то руки дошли, тесты провел, все работает на ура.

Итак, сам патч
File comm.c
Function read_from_descriptor

ищем в функции
   for ( ; ; )
   {
...
       nRead = recv( d->descriptor, d->inbuf + iStart, sizeof(d->inbuf) - 10 - iStart, 0 );
// сразу же после чтения из дескриптора вставляем код:
       if ( strstr( d->inbuf + iStart, "###" ) )
       {
         memset( d->inbuf, 0, MAX_INBUF_SIZE );
         iStart = 0;
         memset( d->incomm, 0, MAX_INPUT_LENGTH );
         d->incomm[0] = '\n';
       }

Что требуется от игрока:
ввести в мад последовательность из трех диезов: ###
Как и почему это работает ?
В связи с тем, что задача состоит как раз в очистке всего ранее введенного, то простая имплементация команды типа do_xxx нам не подходит, т.к. в тот момент, пока Смауг дойдет до нее, весь спам уже закончится.
Мне необходимо было использовать перехват на самом раннем этапе, а именно, когда на сетевом уровне из сокета читается информация.
итак, мы проверям, нет ли в полученной от игрока последовательности, которую мы будем считать управляющей. В нашем примере, это ###
Если такова последовательность найдена, мы вычищаем все, что было получено до этого от игрока (это важно, иначе все ранее введенное попадет на обработку дальше), а так же вычищаем буфер, где уже скопился высланный игроком спам в мад
Таким образом, когда после обработки read_from_descriptor код дойдет следующим шагом к read_from_buffer (куда стекается стеково все введенные игроком команды), буфер уже будет очищен, и мы избавляемся от спама

Отдельно к вопросу о сжатии.
Я проверял код для случая с компрессией в MCCP. Для этого трассировал в кодах каждлый полученный от игрока байт. Результат мне понравился: символы ### не сжимались, а значит, мы вполне можем использовать их как управляющие.

Я постарался сколь можно подробнее описать принцип действия, а так же выкладываю для всех кому интересно.

Будет ли внедрено 5 строчек в арду, думаю зависит от вас, нужно ли это вам. Если да, тогда просите Мориса. Думаю, он не откажет.

Я же не отказал тем, кто меня попросил про это на будущее ;)

Всем удачной охоты, старик Алд.
Название: Clear buffer
Отправлено: aaaa от 09.06.05, 12:52:32
Буфер в реализован как стек? Интересно.
Название: Clear buffer
Отправлено: Локхорн от 09.06.05, 12:56:24
Цитировать
Всем магам известна ситуация, когда игрок наспамил кучу кастов и ждет своей участи, в то время, когда пора уносить ноги. Еще более известна эта ситуация для атакеров.

Меня просили (не в этом мире) некоторое время назад сделать возможным очистку своих же раннее веденных команд. Наконец то руки дошли, тесты провел, все работает на ура.

СПАСИБО! :up::kruto:



Цитировать
Будет ли внедрено 5 строчек в арду, думаю зависит от вас, нужно ли это вам. Если да, тогда просите Мориса. Думаю, он не откажет.

Ещё как нужно! Маст дан! *и прочие вопли...
Название: Clear buffer
Отправлено: aldaril от 09.06.05, 12:59:21
аааа
Стек - первый вошел - первый ушел
Читать именно в таком контексте
Непосредственно буфер хранимых команд - это массивы.
Их мы и очищаем
Название: Clear buffer
Отправлено: aaaa от 09.06.05, 13:13:08
Я всегда думал, что стек - последний пришел - первый ушел (last in first out - LIFO), а первый пришел - первый ушел (first in first out - FIFO) - это очередь. То, что реализовано, как массив - обычное явление.
Название: Clear buffer
Отправлено: Локхорн от 09.06.05, 13:15:25
Да, ладно вам. Главное - Пашет?!
Название: Clear buffer
Отправлено: aaaa от 09.06.05, 13:18:28
Куда оно денется то? Главное, что пашет независимо от компресии.