![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
KPEHDEL |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 31.3.2010 Репутация: нет Всего: нет |
Здравствуйте. Делаю UDP чат. Возник вопрос как лучше отправить сообщение всем.
Допустим в чате авторизовались(послали логин/пароль) 3 пользователя. Записывать адрес каждого и потом в цикле с помощью sendto отправлять каждому? Ведь UDP не устанавливает соединение. Или как это делают нормальные люди?) |
|||
|
||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 2 Всего: 16 |
У меня есть одна шутка про UDP. Но, боюсь, она до вас не дойдёт...
|
|||
|
||||
KPEHDEL |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 31.3.2010 Репутация: нет Всего: нет |
Мог бы и написать, раз уж постишь. Может дошла бы) Я не совсем тупой как бы) Протокол, вроде знаю. Это сообщение отредактировал(а) KPEHDEL - 22.9.2012, 15:47 |
|||
|
||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 2 Всего: 16 |
Ужэ не дошла, успокойтесь. |
|||
|
||||
KPEHDEL |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 31.3.2010 Репутация: нет Всего: нет |
tzirechnoy, дошло только после того как разжували)
Вопрос актуален. Сейчас записываю адреса авторизовавшихся в sockaddr_in users_online_addr[10]; И потом в цыкле отправляю. Но это ведь не нормально да? Это сообщение отредактировал(а) KPEHDEL - 23.9.2012, 10:56 |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Если у Вас ограничение в 10 пользователей, то почему не использовать TCP? Добавлено через 2 минуты и 22 секунды Всё зависит от логики, которую Вы хотите воплотить. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
KPEHDEL, тут шутка юмора заключалась в том что она не дошла бы до вас не потому что вы тупой, а потому, что протокол UDP не дает никаких гарантий (в отличии от TCP) по доставке пакетов. еще из приблизительно такого типа юмора, что запомнилось: Всех людей можно разделить ровно на три категории: тех кто считать умеет, и тех кто не умеет. ну и т.д. |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Ещё есть: люди делятся на 10 категорий - те кто понимает двоичную систему и тех, кто нет
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
semibug |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 27.3.2009 Репутация: нет Всего: нет |
Сервер какой-то предусматривается?
Отправить можно по очереди всем через sendto, как извращение - использовать мульти и широковещательные пакеты. По поводу гарантии доставки UDP сообщений - в локалке скорее всего потерь не будет (если нет переходов 10/100/1000 на узлах и приложений забивающих каналы). Если гарантии нужны, рекомендую попридумывать какой-то механизм подтверждений, в течении 2 дней, потом посмотреть на TCP. Это сообщение отредактировал(а) semibug - 23.9.2012, 10:05 |
|||
|
||||
KPEHDEL |
|
||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 31.3.2010 Репутация: нет Всего: нет |
Спасибо за шутки)
Ограничение не в 10 пользователей. Просто пока написал столько.
В моей задаче больше подходит UDP. Полная гарантия доставки не нужна, так как если пакет будет доставлен сильно позже, он уже не будет нужен.
Да, сервер предусматривается, работать должно не только в локалке.
Пока так и сделал, но это не красиво.
Пойду подробнее читать об этом. Спасибо за ответы, если будут ещё варианты, пишите. Интересно как же делают в онлайн играх сделанных на udp, думаю там не отправляют по очереди в цикле с помощью sendto ![]() |
||||||||||
|
|||||||||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 2 Всего: 16 |
Именно отправляют, именно в цыкле (ну, с некоторым распараллеливанием, которое распараллеливание вообще, и не зависит от sockets).
Мультикаст, по сути, пока не работает -- то есть если это полностью твоя сеть, с твоими роутерами и свитчами, и у тебя есть власть над админами конечных точек -- то есть шанс это настроить. Если клиент, который владеет сетью и конечными точками, готов заплатить тебе 100500 баксов за твоё решэние -- тожэ. В средне-нормальной IP-сети -- нет, он просто не работает. Броадкаст -- это в рамках одного сегмента сети, и поэтому ни для чего кроме настройки сети в этом сегменте неприспособлен. Добавлено через 2 минуты и 25 секунд И самое важное: дажэ локальная сеть с 1% потерь -- это хреновенькая локальная сеть, но работающая и встречающаяся нередко. 0.1% потерь -- это сплошь и рядом. Если не хочешь, чтобы каждая 300-я фраза молча пролетала мимо клиента -- надо что-то делать. |
|||
|
||||
KPEHDEL |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 31.3.2010 Репутация: нет Всего: нет |
Ну в принципе представление я получил, то есть если ориентация не только на сеть, то в цикле и с распараллеливанием.
Что-то делать для уменьшения вероятности потери нужного пакета в любом случаи прийдётся, но это уже немного позже. Спасибо за ответы. ![]() |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Пожалуйста, объясните, почему. И как Вы хотите реализовать отсоединение клиента от чат-сервера. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Видеочат - конференция? Если просто текст, тогда непонятно почему UDP лучше. -------------------- вопросов больше чем ответов |
|||
|
||||
KPEHDEL |
|
||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 31.3.2010 Репутация: нет Всего: нет |
В универе скоро будет задание, сделать мини игру на сокетах. Ориентация при моём выборе идёт не на чат, просто решил, что стоит начать с консольного чата. Выбрал UDP в основном из-за быстроты и гибкости. Про все его минусы знаю, про то, что нет гарантии доставки, произволный порядок передачи данных, размножение и т.д. В мини-игре, которую я буду реализовывать, если пакет прийдёт позже он попросту не будет нужен. Следовательно гарантия доставки не нужна, нужна скорость. Конечно, скорей всего я встречу подзадачу, в которой вероятность потери должна быть минимальна, и было бы интересно, попробовать своять велосипед самому. Ведь это весело и хардкорно. Возможно буду использовать UDP совместно с TCP, для разных подзадач. Также сейчас читаю о RUDP. Кстате моё мнение, что именно для чата, TCP подошёл бы больше, так как в чате важнее не скорость, а гарантия. Возможно для чата его и буду использовать. Однако сейчас работаю с UDP, следовательно вопросы пока о UDP.
Со стороны клиента при отправке соответствующей команды. Со стороны сервера, в качестве проверки, отправка клиенту запроса(не один раз), на который клиент должен ответить, иначе дисконнект. В догонку задам маленький вопрос: Сделал два потока, чтобы приём и отправка сообщений не мешали друг другу. Функция потока:
Метод в котором вызывается второй поток:
Так вот, созданный второй поток работает нормально. А цикл while в отвечающий за приём работает не нормально, нельзя сказать, что не работает вовсе. Происходит следующее: Сначала 1 раз выводится test. А потом работает только второй поток. Иначе бы сообщением "test" заспамило, а также я получал бы сообщения от сервера. Подскажите пожалуйста в чём дело. Заранее спасибо. PS: Наверное тему правильнее было создать в разделе C/C++: Сети. Если так перенесите пожалуйста. Это сообщение отредактировал(а) KPEHDEL - 23.9.2012, 22:20 |
||||||||||
|
|||||||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |