| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > отправка сообщения udp |
| Автор: 4eJIoBekMoJIekyJIa 20.5.2008, 20:26 |
| Всем привет. Как можно отправить сообщение сразу на несколько сокетов с помощью юдп? |
| Автор: 4eJIoBekMoJIekyJIa 21.5.2008, 12:14 |
| не мог бы ты обьяснить как должна быть заполнена структура ip_mreqn ? на сколько я понял в структуре есть поля локальный ip и ip группы, но почему то нет номеров портов. |
| Автор: MAKCim 21.5.2008, 21:29 | ||
порт задается через bind() если в системе есть только один сетевой интерфейс, в ip_mreqn нужно указать только адрес группы (остальные поля = 0) если больше одного, то еще и локальный адрес интерфейса в этом случае imr_address должен совпадать с sockaddr_in.sin_addr, который передается в bind() |
| Автор: 4eJIoBekMoJIekyJIa 21.5.2008, 23:50 |
| не понял, на мультикастный адрес должны подписываться те,кому мы будем отправлять сообщения? Мультикастный адрес должен както по особенному задаваться или просто как обычный ip адрес? |
| Автор: MAKCim 22.5.2008, 08:53 | ||||
да
любой адрес из 224.0.0.0 - 239.255.255.255 является мультикастным |
| Автор: 4eJIoBekMoJIekyJIa 22.5.2008, 10:34 |
| а если адрес 194.х.х.х что нельзя сделать его мультикастным? |
| Автор: MAKCim 22.5.2008, 11:19 | ||
мультикастные адреса сродни адресам private-сетей они фиксированы в рамках LAN ты можешь выбрать любой мультикастный адрес из диапазона 224.0.0.0 - 224.0.0.255 главное, чтобы целевые хосты на него подписались вообщем, читать http://en.wikipedia.org/wiki/Multicast_address |
| Автор: 4eJIoBekMoJIekyJIa 22.5.2008, 13:43 |
| Прочитал спс, то есть алгоритм отправления такой: связываем с мультикастным адресом сокеты которые будут получать, отправляем с "сокета-отправителя" сообщение на мультикастный адрес там он переправляется всем кто на него подписан. Правильно? И еще такой вопрос как-нибудь можно выяснить сколько сокетов подписано на мультикастный адрес? |
| Автор: 4eJIoBekMoJIekyJIa 22.5.2008, 18:07 | ||||
| смотри есть такое простое приложение в нем к серверу подключаеться несколько клиентов и им отправляеться сообщение сервер:
клиент:
когда я запускаю одновременно сервер и несколько клиентов то все клиенты пишут recv error и выходят. Не пойму в udp recvfrom не блокирует приложение до получения сообщения чтоли? |
| Автор: MAKCim 22.5.2008, 19:06 | ||
да
ICMP echo request на мультикастный адрес программы посмотрю потом |
| Автор: 4eJIoBekMoJIekyJIa 22.5.2008, 22:30 |
| не мог бы ты посмотреть, мне просто завтра к 12 надо сдавать... Я видимо чтото недопонимаю в том как работает multicastные айпи |
| Автор: MAKCim 24.5.2008, 11:56 | ||||
уже, видимо, не актуально
скорее всего допустим, есть LAN в нем есть сервер, который с определенной частотой передает какую-то информацию заинтересованным в ее получении клинтам заинтересованность определяется подпиской на multicast-адрес (IP_ADD_MEMBERSHIP) при получении пакета клиентом на уровне NIC осуществляется проверка целевого адреса (MAC-адреса) если он является multicast-адресом, то идет поиск в списке (или хэш-таблице) зарегистрированных в NIC multicast-адресов (первое назначение imr_multiaddr в ip_mreqn и единственное назначение imr_address там же) если совпадение найдено, то пакет принимается (несовершенная фильтрация на уровне NIC) и передается на уровень L1, потом на L2 и L3 на уровне L3 (сетевой уровень) осуществляется совершенная фильтрация (второе назначение imr_multiaddr) (т. к разным multicast-адресам могут соответствовать одинаковые MAC-адреса) если проверка успешна, идет передача пакета на L4 (UDP) конкретному сокету |
| Автор: 4eJIoBekMoJIekyJIa 26.5.2008, 20:09 | ||
| А понял, спасибо. Еще не мог бы ты помочь с select'ом, когда через tcp, то понятно, там после accept'a выдаются связанные сокеты. А когда через юдп, я сначала вызываю
после вызова, насколько я понимаю, в cl_addr занесутся данные того кто прислал сообщение. мне нужно создать новый сокет забинденный к cl_addr и потом по нему вызывать select? |
| Автор: MAKCim 26.5.2008, 21:10 |
| 4eJIoBekMoJIekyJIa, после получения пакета, отправляешь нужный пакет по адресу cl_addr зачем тут select()? |
| Автор: 4eJIoBekMoJIekyJIa 27.5.2008, 00:08 |
| ну просто у меня есть несколько клиентов, recvfrom о котором я писал выше нужен чтобы установить соединение, после этого сервер должен отправить всем подключенным клиентам сообщение(скорее всего широковещательное), дальше клиенты отвечают, мне нужно определить кто первым ответил, для этого я и хочу использовать select. ЗЫ: когда я отправляю бродкаст он на мой комп не приходит?Можноли как-нибудь сделать чтобы приходило? Если нет, то не понятно как тестить... |
| Автор: MAKCim 27.5.2008, 09:17 | ||
через select() ты никак не определишь, кто ответил первым нет раскидать клиентов по разным портам и работать через loopback-интерфейс Добавлено через 33 секунды а вообще не мешало бы услышать задачу полностью что на входе, что на выходе |
| Автор: 4eJIoBekMoJIekyJIa 27.5.2008, 11:13 | ||
| Задача такая: есть бабушка(сервер) которая кидает зерна, и n воробьев, которые хотят их схватить(клиенты), если воробей схватил зерно, то следующий розыгрыш он пропускает. Сначала я http://forum.vingrad.ru/forum/topic-211509.htmlчерез потоки, но преп сказал что если он захочет запустить 1000 клиентов то столько потоков не создастся, и посоветовал делать через бродкаст всё в одном потоке. потомучто когда выполниться селект уже может прийти несколько ответов? А как тогда определить кто первый?
а это как? |
| Автор: MAKCim 27.5.2008, 12:04 |
| 4eJIoBekMoJIekyJIa, где конкретно будут располагаться клиенты? (хост, LAN, глобальная сеть) |
| Автор: 4eJIoBekMoJIekyJIa 27.5.2008, 12:12 |
| все на одном компе |
| Автор: MAKCim 27.5.2008, 12:29 |
| 4eJIoBekMoJIekyJIa, 1. что мешает вызывать recvfrom() до получения ответов ото всех клиентов? первый вызов recvfrom() будет соответствовать первому ответившему клиенту 2. на хосте широковещательную (и многоадресную) передачу организовать нельзя |
| Автор: 4eJIoBekMoJIekyJIa 27.5.2008, 12:33 |
| Ладно. А одновременно отправить как-нибудь подругому можно? |
| Автор: MAKCim 27.5.2008, 12:44 | ||
нет, т. к в рамках хоста все клиенты будут "сидеть" на разных портах |
| Автор: 4eJIoBekMoJIekyJIa 27.5.2008, 14:51 | ||||||
слушай смотри если есть такой код
и у меня на сервере вызывается
какой порт занесется в cl_addr? или там будет пусто?
насколько я понимаю лупбэк интерфейс какбы создает новый сетевой интерфейс, а как его создать? |
| Автор: MAKCim 27.5.2008, 21:07 | ||
порт клиента (назначается динамически в момент отправки пакета клиентом)
не понял вопроса loopback - виртуальный сетевой интнрфейс (не соответствет никакому NIC) создавать ничего не надо, он является частью сетевой подсистемы ядра доступен через символьный идентификатор lo |
| Автор: 4eJIoBekMoJIekyJIa 27.5.2008, 21:14 | ||
не понял как это...объясни пожалуйста |
| Автор: MAKCim 27.5.2008, 23:19 |
делать bind() на сокетах клиентов (или ничего не делать: порт назначит ядро) все пакеты отсылать на 127.0.0.1 |
| Автор: 4eJIoBekMoJIekyJIa 28.5.2008, 09:45 |
Если просто выслать на 127.0.0.1 онж не перешлется всем сокетам клиентам. |
| Автор: MAKCim 28.5.2008, 10:07 | ||
клиенты отсылают пакеты серверу на 127.0.0.1 сервер отсылает пакеты клиентам на 127.0.0.1 с указанием портов клиентов (из cl_addr) |
| Автор: 4eJIoBekMoJIekyJIa 31.5.2008, 23:51 |
ну в моей задаче такое не катит(сервер ведь будет поочереди отсылать на каждый порт),а мне нужно чтобы всем клиентам приходило одновременно... смотри а если я буду биндить клиенты на 127.0.0.2 127.0.0.3 итд и отправлять бродкаст на 127.0.0.255 они его получат? |
| Автор: MAKCim 1.6.2008, 09:41 | ||
хотя да, должно работать только не 127.0.0.255, а 127.255.255.255 |
| Автор: 4eJIoBekMoJIekyJIa 1.6.2008, 12:02 | ||||
| во и я так же подумал, но почему то ничего не принимаеться может это особенности того что у меня линукс на виртуальной машине стоит и там сеть не настроена(хотя поидее на адреса 127.х.х.х это не влияет) вот начало кода сервера, он биндится на 11000 порт а шлет бродкаст на 4004
клиент биндится на 4004 порт и опишник, тот который указывается на входе, и ждет сообщения. Вот начало
|
| Автор: MAKCim 2.6.2008, 11:06 | ||
| 4eJIoBekMoJIekyJIa, посмотри через
есть ли поддержка широковещательной передачи на интерфейсе |
| Автор: 4eJIoBekMoJIekyJIa 2.6.2008, 12:42 |
| походу нет, тока адрес написан и маска. А как сделать поддержку? |
| Автор: MAKCim 2.6.2008, 12:54 | ||
с ходу не скажу |
| Автор: 4eJIoBekMoJIekyJIa 2.6.2008, 13:30 |
| лан уже не срочно впринцыпе |
| Автор: 4eJIoBekMoJIekyJIa 2.6.2008, 20:27 |
| Все MAKCim, спасибо большое, разобрался. Считаю, что тему можно закрыть. |