Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Делаю UDP сервер. Работать будет в инете. В основном будет работать с одиночными сообщениями: принял, проверил, переслал/ответил. Тут все ясно. Но будут такие ситуации когда целый поток сообщений. Тестил отправку залпом 1000 пакетов по 1000 байт по разным каналам. В некоторых случаях потеря до 90%. Правда не понял где именно теряется: у отправителя или получателя, т.е. не отправляются или не доходят. 1. Ломаю голову как организовать максимально быструю доставку: с одной стороны если слать по одному, то все доходят, но скорость передачи низкая, если слать залпом все и досылать потерянное тоже медленно т.к. 90% теряется. Пока пришел к варианту слать пачками по 50-70 пакетов и получать подтверждение. Наверняка готовые стратегии передачи есть , буду рад советам и ссылкам на эту тему. 2. Для минимизации потерь на входе хочу максимально ускорить получение разделив на отдельные потоки прием и отправку. хочу сделать примерно так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. Код схематичный, чтобы задумку показать. Просьба к мелочам не придираться, типа зацикленный parse_thread(). Синхронизация потоков, контроль ошибок и контроль буферов будет. Т.е. поток чтения только принимает и помещает принятое в память, поток обработки разбирает сообщения и при необходимости что-то отправляет. Тут возникает вопрос: Можно так использовать сокет в разных потоках? Т.е. один только принимает, второй только шлет. Также интересны мнения даст ли такая схема хоть какие-то преимущества на однопроцессорной виртуалке по сравнению с "принял / обработал / отправил", если "обработал" это быстрые операции (проверка структуры, отправителя и т.п.). принял / обработал / отправил Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. И еще один ламерский вопрос: если я читаю по 1000 байт и прилетит пакет большего размера, то что произойдет? Я надеюсь что он просто удалится и ко мне не попадет. PS Работать все будет в линуксовой виртуалке на хостинге. Клиенты на виндовсе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 11:15 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Dima TПока пришел к варианту слать пачками по 50-70 пакетов и получать подтверждение. Так юзайте TCP, раз вы можете так сходу менять протокол :) Потеря пакета происходит в следующих случаях: 1) Принимающая сторона имеет недостаточно большой буфер для входящих пакетов и не успевает читать. В этом случае все невместившееся просто игнорируется. (скорее всего именно это и происходит) Задать побольше буфер для UDP сокета. 2) Отправляющая сторона отбрасывает часть пакетов еще до отправки по разным причинам. (я не знаю что происходит при переполнении буфера отправки сокета, скорее всего блокировка потока, но возможно пакеты просто сразу удаляются, поскольку никто не обещал что они будут куда либо доставлены). 3) Пакеты теряются из-за загруженности сети Проверить что просиходит с пакетами можно командой netstat -su на обоих хостах которая покажет статистику по UDP пакетам. Dima Tесли я читаю по 1000 байт и прилетит пакет большего размера, то что произойдет? Я надеюсь что он просто удалится и ко мне не попадет. Если прилетит больший пакет, то вы прочтете запрошенный размер, а остальное удалится. Т.е. следующее чтение прочтет следующий пакет, а не остаток предыдущего. По крайней мере в линуксе так. Dima T Можно так использовать сокет в разных потоках? В теории можно, но я нигде не видел в доках явного разрешения (правда особо и не искал :)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 12:20 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Dima TПока пришел к варианту слать пачками по 50-70 пакетов и получать подтверждение. Наверняка готовые стратегии передачи есть, буду рад советам и ссылкам на эту тему. Есть: TCP шлёт пакетов на размер окна без подтверждения, потом получает подтверждение на всю пачку. Dima TТут возникает вопрос: Можно так использовать сокет в разных потоках? Т.е. один только принимает, второй только шлет. Можно. Dima TИ еще один ламерский вопрос: если я читаю по 1000 байт и прилетит пакет большего размера, то что произойдет? Я надеюсь что он просто удалится и ко мне не попадет. Такой пакет просто не сможет отправиться. UDP пакеты ограничены ЕМНИП 256 байтами или даже меньше. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 12:20 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Да, забыл самое главное. Как бы вы не старались, избежать потерь в UDP нельзя. Поэтому если ваше приложение не допускает потерь, то вам нужен другой протокол доставки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 12:28 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovакой пакет просто не сможет отправиться. UDP пакеты ограничены ЕМНИП 256 байтами или даже меньше. Нет, нет такого лимита. Лимит - это MTU сетевухи либо если включен discovery то MTU пути - стандартный лимит для IP протоколов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 12:35 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyНет, нет такого лимита. Да, действительно, такого лимита нет. MSDNFor message-oriented sockets, care must be taken not to exceed the maximum packet size of the underlying subnets, which can be obtained by using getsockopt to retrieve the value of socket option SO_MAX_MSG_SIZE. If the data is too long to pass atomically through the underlying protocol, the error WSAEMSGSIZE is returned and no data is transmitted. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 12:47 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Dima TДелаю UDP сервер. ... Но будут такие ситуации когда целый поток сообщений. Тестил отправку залпом 1000 пакетов по 1000 байт по разным каналам. В некоторых случаях потеря до 90%. Правда не понял где именно теряется: у отправителя или получателя, т.е. не отправляются или не доходят. Ты вообще в курсе, что UDP не гарантирует доставку сообщений ? За что боролся, на то и напоролся. Где они теряются -- в принципе, не важно. Dima T1. Ломаю голову как организовать максимально быструю доставку: с одной стороны если слать по одному, то все доходят, но скорость передачи низкая, если слать залпом все и досылать потерянное тоже медленно т.к. 90% теряется. Пока пришел к варианту слать пачками по 50-70 пакетов и получать подтверждение. Наверняка готовые стратегии передачи есть , буду рад советам и ссылкам на эту тему. UDP используют для задач, где в принципе потеря данных нестрашна (например, передача видео, если очередной кадр не получен, он всё равно теряет свою актуальность), либо для организации поверх UDP своих протоколов. Видимо, ты решился заняться последним. Абстрактно задачу решать я считаю не имеет смысла -- нужно решать в рамках предметной области. Dima TТут возникает вопрос: Можно так использовать сокет в разных потоках? Т.е. один только принимает, второй только шлет. Э... сложный вопрос. Dima TИ еще один ламерский вопрос: если я читаю по 1000 байт и прилетит пакет большего размера, то что произойдет? Я надеюсь что он просто удалится и ко мне не попадет. Будет обрезан, но в общем случае читай man по функции, которую используешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 13:27 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyDima TПока пришел к варианту слать пачками по 50-70 пакетов и получать подтверждение. Так юзайте TCP, раз вы можете так сходу менять протокол :) Понятно что в TCP уже есть то что надо, сначала его и думал использовать, даже boost asio поизучал и другие либы кросплатформенные. У UDP есть большие плюсы: 1. UDP сервер может упасть, перегрузиться, а клиент это даже не заметит, решит что потери в сети. 2. Можно использовать несколько UDP серверов одновременно (при наличии синхронизации между ними) 3. По UDP элементарно делается p2p обмен между клиентами за роутерами (проверял из-за двух DLink`ов без какой либо доп. настроек): оба клиента постучались на сервер, сервер сообщил обоим клиентам адреса откуда они ему шлют (котырые НАТ дал), а дальше они друг-другу, сервер не нужен. TCP такое не позволит. Ради p2p стоит поизобретать свой аналог TCP. Тем более что у меня за раз пролетает 200 кб максимум. Anatoly MoskovskyЗадать побольше буфер для UDP сокета. setsockopt(SO_RCVBUF) оно? Anatoly MoskovskyЕсли прилетит больший пакет, то вы прочтете запрошенный размер, а остальное удалится. Т.е. следующее чтение прочтет следующий пакет, а не остаток предыдущего. По крайней мере в линуксе так. Такое поведение устраивает. Главное чтоб за пределы буфера не вылез и прием не застопорил. Anatoly MoskovskyDima T Можно так использовать сокет в разных потоках? В теории можно, но я нигде не видел в доках явного разрешения (правда особо и не искал :)). Все больше склоняюсь к тому что надо как можно быстрее принимать если есть что принимать, т.к. скорость приема критична. Придумал еще один однопоточный вариант с select() Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. тут единственный минус по сравнению с многопоточным в том что добавляется select() для проверки входящих, но думаю он особо не должен тормозить. Может такая схема даже лучше, чтобы вылетающие пакеты не сбивали влетающие ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 13:32 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
MasterZivТы вообще в курсе, что UDP не гарантирует доставку сообщений ? За что боролся, на то и напоролся. Где они теряются -- в принципе, не важно. В курсе, вот и спросил как минимизировать потери. Я не за потери переживаю, а за трафик, он бесплатный до определенного предела, у многих хостеров в тарифах 20-25Гб в месяц бесплатно, а дальше особые условия с конскими ценами. Да и клиенты у меня есть на помегабайтных тарифах. Так что терять 90% трафика по дороге вообще не вариант. Надо 3-5%, не больше. И вторая проблема с очень медленными каналами типа 3G с плохим приемом, там потери - это лишние перезапросы потерянного, т.е. доп.тормоза. Вобщем надо как-то и терять поменьше и слать побыстрее. Dima TАбстрактно задачу решать я считаю не имеет смысла -- нужно решать в рамках предметной области. Задача очень даже не абстрактная. Мегабайт я с запасом взял, надо гонять файлы от 10 до 200 кб. И короткие сообщения меньше килобайта. Буду изобретать алгоритм, чтоб и в гигабитной локалке и в GPRSе максимум скорости был. Anatoly MoskovskyНет, нет такого лимита. Лимит - это MTU сетевухи либо если включен discovery то MTU пути - стандартный лимит для IP протоколов. Максимум размер UDP 65507 байт. Больше не отправляется. Тесты показали что пакеты 65507 байт проходят до сервера в инете, но очень часто теряются. Зависит от типа подключения к инету. Например через L2TP подключение с MTU 1400 долетают до сервера, но на обратном пути рубится. С L2TP максимум 1372 байта (1400 -8 (заголовок IP) - 20 (заголовок UDP)), т.е. 1372 проходят, а 1373 уже больше половины теряется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 14:03 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Торренты используют UDP http://habrahabr.ru/post/68332/ Есть описание протокола, буду изучать http://www.bittorrent.org/beps/bep_0029.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 14:21 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Dima TУ UDP есть большие плюсы: 1. UDP сервер может упасть, перегрузиться, а клиент это даже не заметит, решит что потери в сети. 2. Можно использовать несколько UDP серверов одновременно (при наличии синхронизации между ними) 3. По UDP элементарно делается p2p обмен между клиентами за роутерами (проверял из-за двух DLink`ов без какой либо доп. настроек): оба клиента постучались на сервер, сервер сообщил обоим клиентам адреса откуда они ему шлют (котырые НАТ дал), а дальше они друг-другу, сервер не нужен. TCP такое не позволит. Ради p2p стоит поизобретать свой аналог TCP. Тем более что у меня за раз пролетает 200 кб максимум.А теперь внимательно читаем спецификацию HTTP/1.x и понимаем, что всё вышеизложенное может быть реализовано даже в рамках этого высокоуровнего протокола. Который проходит не только через NAT, но и, что важнее, через HTTP-прокси. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 15:46 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Dima TПо UDP элементарно делается p2p обмен между клиентами за роутерами (проверял из-за двух DLink`ов без какой либо доп. настроек) Это тебе просто сказочно повезло с твоими д-линками. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 16:00 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovDima TПо UDP элементарно делается p2p обмен между клиентами за роутерами (проверял из-за двух DLink`ов без какой либо доп. настроек) Это тебе просто сказочно повезло с твоими д-линками. нет, это известная техника. Как по твоему работает Скайп? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 16:26 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
lockedКак по твоему работает Скайп?Использует или "добрые души", которые разрешают входящие соединения для всякой всячины или (какое-то количество) "собственных" серверов. Чудес не бывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 16:34 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov (какое-то количество) "собственных" серверов. Чудес не бывает. Эти "собственные сервера" только инициируют соединения. Весь медиа поток идет p2p. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 16:46 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovDima TПо UDP элементарно делается p2p обмен между клиентами за роутерами (проверял из-за двух DLink`ов без какой либо доп. настроек) Это тебе просто сказочно повезло с твоими д-линками. Ну так у меня пользователи в основном с подобным железом. В локалке тестил: виндовый брандмауэр тоже пропустил (сокет был с адресом 0:0, т.е. на усмотрение ОС). 7-ка с дефолтными настройками даже не спросила чего это у вас там шлется. Допишу сервер, сделаю тестового клиента, устрою глобальный тест, тогда будет видно кто из клиентов сможет p2p работать, даже если половина - уже отлично. Хотя подозреваю что большинство (у кого дефолтные настройки натов без доп.запретов) будет работать, т.к. принципы UDP ната таковы что делается связка localIP:port <-> natIP:port если внешний порт постоянный (natIP:port) при отправке по разным адресам, а он скорее всего постоянный т.к. иначе портов не напасешься если клиент начнет слать куче получателей, то дальше можно пробить даже продвинутые наты (помнящие куда клиент обращался) - для этого достаточно чтобы оба клиента послали по пакету навстречу друг-другу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 16:55 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Dima TВ локалке тестил: виндовый брандмауэр тоже пропустил (сокет был с адресом 0:0, т.е. на усмотрение ОС). 7-ка с дефолтными настройками даже не спросила чего это у вас там шлется. Вот только не все провайдеры ткие пофигисты. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 17:36 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
lockedЭти "собственные сервера" только инициируют соединения. Весь медиа поток идет p2p.Во-первых - я не просто так употребил союз "или". Во-вторых - пофигистов много и (только) это позволяет существовать скайпу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 18:15 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Dima TAnatoly MoskovskyЗадать побольше буфер для UDP сокета. setsockopt(SO_RCVBUF) оно? Пробовали делать на принимающей стороне? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Проблему решило? Пробовали увеличить MTU? У себя в программе собирать несколько пакетов в один массив, передавать его, а на той стороне разбирать его? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 18:47 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovВот только не все провайдеры ткие пофигисты. Что значит пофигисты? Вопрос уходит за рамки темы в сторону моральных/этических/юридических/политических особенностей предоставления услуг. Тут выше упомянутая ссылка на скайп порадовала. Какой провайдер будет вводить ограничения мешающие работе скайпа? Наверно тот которому хочется избавится от немногих оставшихся клиентов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 19:20 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Вася УткинПроблему решило? попробую когда сервер допишу. Вася УткинПробовали увеличить MTU? Это не наш путь. Все должно работать с имеющимися настройками. Все изменения нстроек должны быть только внутри собственного софта, т.е. отправителя и получателя. Вася УткинУ себя в программе собирать несколько пакетов в один массив, передавать его, а на той стороне разбирать его? Если быстро слать кусками по килобайту - доходит очень мало на медленных каналах. Описание протокола торрентов подсказало куда двигаться. У меня складывается мнение что надо изобретать какой-то эвристический алгоритм автоподстройки таймаутов отправки пакетов. Примерно так: послать 50 пакетов, подождать 300 мс, слать следующие 50 пакетов, в это время получить отчет о доставке первых 50-ти, поменять таймаут или количество отправляемое за раз. Т.к. у меня не торренты по несколько гигов, то задача усложняется, т.к. надо подстроится во время отправки 200 кб. Хотя можно не заморачиваться и слать по 20-30 пакетов и дожидаться подтверждения "медленно, но верно". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 20:00 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Dima TКакой провайдер будет вводить ограничения мешающие работе скайпа? 1) Любой мобильный провайдер 2) Любой провайдер, садящий клиентов за собственный NAT Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 20:09 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Если кому интерсно. В итоге решил остановиться на компромиссном однопоточном варианте с select() и приоритетом чтению. однопоточный вариант с select() Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. Лично мне с многопоточностью только доп.гимор при отладке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 20:16 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovDima TКакой провайдер будет вводить ограничения мешающие работе скайпа? 1) Любой мобильный провайдер Как выше писал тест по GPRS (включил WiFi роутер на телефоне, а связь не 3G) показал что канал очень сильно забивается и много потерь, особенно на больших пакетах (> 6000 байт), но из-за убогости сервера не смог померить реальную скорость. Сложно мерить то чего нет. Допишу, буду оптимизировать. В любом случае именно этот канал буду использовать для заточки на скорость, т.к. можно очень медленно передавать 200 кб по гигабитной сетке и никто это не заметит. Dimitry Sibiryakov2) Любой провайдер, садящий клиентов за собственный NAT Это п.1, а как обойти NAT я выше написал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 20:29 |
|
||
|
Чтение и запись в UDP сокет большой очереди пакетов. Как оптимизировать?
|
|||
|---|---|---|---|
|
#18+
Dima T, Перед изобретением велосипеда, стоит посмотреть на работы предков. http://www.amazon.com/gp/product/0132856204/ref=oh_details_o06_s01_i00?ie=UTF8&psc=1 Вполне неплохо описаны все основные принципы построения сетей. В том числе даны и алгоритмы организации сетевых протоколов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 20:31 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38583710&tid=2019608]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
| others: | 16ms |
| total: | 165ms |

| 0 / 0 |
