Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> отправка сообщения udp 
V
    Опции темы
4eJIoBekMoJIekyJIa
Дата 20.5.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 2.11.2007

Репутация: нет
Всего: нет



Всем привет. Как можно отправить сообщение сразу на несколько сокетов с помощью юдп?
--------------------
PM MAIL   Вверх
MAKCim
Дата 20.5.2008, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(4eJIoBekMoJIekyJIa @  20.5.2008,  20:26 Найти цитируемый пост)
Всем привет. Как можно отправить сообщение сразу на несколько сокетов с помощью юдп? 

использовать мультикастный адрес
естественно, хосты должны подписаться на него
Код

struct ip_mreqn ip_mreqn;
...
setsockopt(sock_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &ip_mreqn, sizeof(ip_mreqn));


Добавлено через 3 минуты и 54 секунды
4eJIoBekMoJIekyJIa, 
прежде чем создавать новые темы разберись со старыми
а то некрасиво получается


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
4eJIoBekMoJIekyJIa
Дата 21.5.2008, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 2.11.2007

Репутация: нет
Всего: нет



не мог бы ты обьяснить как должна быть заполнена структура ip_mreqn ?
на сколько я понял в структуре есть поля локальный ip и ip группы,  но почему то нет номеров портов.

Это сообщение отредактировал(а) 4eJIoBekMoJIekyJIa - 21.5.2008, 12:22
--------------------
PM MAIL   Вверх
MAKCim
Дата 21.5.2008, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(4eJIoBekMoJIekyJIa @  21.5.2008,  12:14 Найти цитируемый пост)
на сколько я понял в структуре есть поля локальный ip и ip группы,  но почему то нет номеров портов.

порт задается через bind()
если в системе есть только один сетевой интерфейс, в ip_mreqn нужно указать только адрес группы (остальные поля = 0)
если больше одного, то еще и локальный адрес интерфейса
в этом случае imr_address должен совпадать с sockaddr_in.sin_addr, который передается в bind()


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
4eJIoBekMoJIekyJIa
Дата 21.5.2008, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 2.11.2007

Репутация: нет
Всего: нет



не понял, на мультикастный адрес должны подписываться те,кому мы будем отправлять сообщения?
Мультикастный адрес должен както по особенному задаваться или просто как обычный ip адрес?
--------------------
PM MAIL   Вверх
MAKCim
Дата 22.5.2008, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(4eJIoBekMoJIekyJIa @  21.5.2008,  23:50 Найти цитируемый пост)
не понял, на мультикастный адрес должны подписываться те,кому мы будем отправлять сообщения?

да
Цитата(4eJIoBekMoJIekyJIa @  21.5.2008,  23:50 Найти цитируемый пост)
Мультикастный адрес должен както по особенному задаваться или просто как обычный ip адрес? 

любой адрес из 224.0.0.0 - 239.255.255.255 является мультикастным


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
4eJIoBekMoJIekyJIa
Дата 22.5.2008, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 2.11.2007

Репутация: нет
Всего: нет



а если адрес 194.х.х.х что нельзя сделать его мультикастным?
--------------------
PM MAIL   Вверх
MAKCim
Дата 22.5.2008, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(4eJIoBekMoJIekyJIa @  22.5.2008,  10:34 Найти цитируемый пост)
а если адрес 194.х.х.х что нельзя сделать его мультикастным? 

мультикастные адреса сродни адресам private-сетей
они фиксированы
в рамках LAN ты можешь выбрать любой мультикастный адрес из диапазона 224.0.0.0 - 224.0.0.255
главное, чтобы целевые хосты на него подписались
вообщем, читать тут


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
4eJIoBekMoJIekyJIa
Дата 22.5.2008, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 2.11.2007

Репутация: нет
Всего: нет



Прочитал спс, то есть алгоритм отправления такой: связываем с мультикастным адресом сокеты которые будут получать, отправляем с "сокета-отправителя" сообщение на мультикастный адрес там он переправляется всем кто на него подписан.
Правильно?
И еще такой вопрос как-нибудь можно выяснить сколько сокетов подписано на мультикастный адрес?

Это сообщение отредактировал(а) 4eJIoBekMoJIekyJIa - 22.5.2008, 13:56
--------------------
PM MAIL   Вверх
4eJIoBekMoJIekyJIa
Дата 22.5.2008, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 2.11.2007

Репутация: нет
Всего: нет



смотри есть такое простое приложение в нем к серверу подключаеться несколько клиентов и им отправляеться сообщение

сервер:
Код


#define BUF 64
#define MCAST_IP "224.0.0.1"
#define MCAST_PORT 12345


#include <errno.h>
#include<signal.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/time.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <pthread.h>
#include <stdio.h>
#include <vector>
#include <string.h>
#include <unistd.h>
#include <iostream>

using namespace std;
vector<int> clients;
vector<pthread_t> threads;
int isFirst = 1, listenfd, not_chck, proc_left, first_to_left = 1, quit = 0;

pthread_cond_t srv_cond = PTHREAD_COND_INITIALIZER;
pthread_cond_t cl_cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t cl_mutex = PTHREAD_MUTEX_INITIALIZER;
timeval cur_time;

int size = 0, work_sock;
void start(int arg)
{
        char line[BUF] = "rdy?\0";
        int fst = 1;
        struct sockaddr_in mcast_addr;


        bzero(&mcast_addr, sizeof(mcast_addr));
        mcast_addr.sin_family = AF_INET;
        mcast_addr.sin_port = MCAST_PORT;
        inet_aton(MCAST_IP, &mcast_addr.sin_addr);
        if(!size) {
                cout<<"no clients connected. terminating"<<endl;
                exit(0);
        }
        sendto(work_sock, line, strlen(line), 0,
                        (struct sockaddr *)&mcast_addr, sizeof(struct sockaddr));
        cout<<"end"<<endl;
        close(work_sock);
        quit = 1;
        return ;
}

int main()
{
        int ttl = 64;
        struct sockaddr_in cl_addr, srv_addr;
        char buffer[BUF] = "";
        work_sock = socket(AF_INET, SOCK_DGRAM, 0);
        bzero(&srv_addr, sizeof(srv_addr));
        srv_addr.sin_family = AF_INET;
        srv_addr.sin_addr.s_addr = htons(INADDR_ANY);
        srv_addr.sin_port = 11000;

        if(bind(work_sock, (sockaddr *)&srv_addr, sizeof(srv_addr)) < 0) {
                cout<<"bind error"<<endl;
                return 0;
        }

        alarm(5);
        signal(SIGALRM, start);

        struct ip_mreqn imr;
        imr.imr_address.s_addr = htons(INADDR_ANY);
        setsockopt(work_sock, IPPROTO_IP, IP_MULTICAST_TTL,(char *)ttl, sizeof(int));
        while(1)
        {
                if(recv(work_sock, buffer, BUF, 0) < 0)
                {
                        cout<<"recieve error"<<endl;
                }
                cout<<"connect"<<endl;
                if(quit)
                        break;
                size++;
        }
        return 0;
}


клиент:
Код


#define num 5
#define BUF 64
#define MCAST_IP "224.0.0.1"
#define MCAST_PORT 12345

#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <pthread.h>
#include <stdio.h>
#include <vector>
#include <string.h>
#include <unistd.h>
#include <iostream>

using namespace std;

int main(int argc, char** argv)
{
        int srv_sock, mcast_sock, corns_left = num;
        struct sockaddr_in mcast_addr, srv_addr;
        char line[BUF];
        char chk[BUF] = "conn\0";

        if(argc == 1)
        {
                cout << "error: no data entered!"<<endl;
                return 0;
        }

        srv_sock = socket(AF_INET, SOCK_DGRAM, 0);

        bzero(&mcast_addr, sizeof(srv_addr));
        mcast_addr.sin_family = AF_INET;
        mcast_addr.sin_port = MCAST_PORT;
        mcast_addr.sin_port = MCAST_PORT;

        if(inet_aton(MCAST_IP, &mcast_addr.sin_addr) == 0) {
                cout<<"error mcast"<<endl;
                exit(-1);
        }

        srv_sock = socket(AF_INET, SOCK_DGRAM, 0);

        bzero(&srv_addr, sizeof(srv_addr));
        srv_addr.sin_family = AF_INET;
        srv_addr.sin_port = MCAST_PORT;

        if(inet_aton(argv[1], &srv_addr.sin_addr) == 0) {
                cout<<"wrong data"<<endl;
                exit(-1);
        }

        bind(srv_sock, (sockaddr *)&srv_addr, sizeof(srv_addr));
        bind(mcast_sock, (sockaddr *)&mcast_addr, sizeof(mcast_addr));

        if(sendto(srv_sock, chk, strlen(chk), 0, (struct sockaddr *) &srv_addr, sizeof(srv_addr)) < 0)
        {
            cout<<"send error"<<endl;
            return 0;
        }

        struct ip_mreqn mreqn;
        inet_aton(MCAST_IP, &mreqn.imr_multiaddr);
        setsockopt(mcast_sock, SOL_SOCKET, IP_ADD_MEMBERSHIP, &mreqn, sizeof(mreqn));

        socklen_t sz = sizeof(srv_addr);
        if(recvfrom(mcast_sock, chk, BUF, 0, (struct sockaddr *) &mcast_addr, &sz) < 0)
        {
            cout<<"recv error"<<endl;
            return 0;
        }
        cout<<chk<<endl;

        return 0;
}


когда я запускаю одновременно сервер и несколько клиентов то все клиенты пишут recv error и выходят.
Не пойму в udp recvfrom не блокирует приложение до получения сообщения чтоли?
--------------------
PM MAIL   Вверх
MAKCim
Дата 22.5.2008, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(4eJIoBekMoJIekyJIa @  22.5.2008,  13:43 Найти цитируемый пост)
Правильно?

да
Цитата(4eJIoBekMoJIekyJIa @  22.5.2008,  13:43 Найти цитируемый пост)
И еще такой вопрос как-нибудь можно выяснить сколько сокетов подписано на мультикастный адрес?

ICMP echo request на мультикастный адрес

программы посмотрю потом


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
4eJIoBekMoJIekyJIa
Дата 22.5.2008, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 2.11.2007

Репутация: нет
Всего: нет



не мог бы ты посмотреть, мне просто завтра к 12 надо сдавать...
Я видимо чтото недопонимаю в том как работает multicastные айпи
--------------------
PM MAIL   Вверх
MAKCim
Дата 24.5.2008, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(4eJIoBekMoJIekyJIa @  22.5.2008,  22:30 Найти цитируемый пост)
не мог бы ты посмотреть, мне просто завтра к 12 надо сдавать...

уже, видимо, не актуально

Цитата(4eJIoBekMoJIekyJIa @  22.5.2008,  22:30 Найти цитируемый пост)
Я видимо чтото недопонимаю в том как работает multicastные айпи

скорее всего

допустим, есть 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) конкретному сокету 

Это сообщение отредактировал(а) MAKCim - 24.5.2008, 11:59


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
4eJIoBekMoJIekyJIa
Дата 26.5.2008, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 2.11.2007

Репутация: нет
Всего: нет



А понял, спасибо.
Еще не мог бы ты помочь с select'ом, когда через tcp, то понятно, там после accept'a выдаются связанные сокеты.
А когда через юдп, я сначала вызываю 
Код

sockaddr_in cl_addr;
socklen_t sz = sizeof(cl_addr);

recvfrom(s, buffer, BUF, 0, (sockaddr *)&cl_addr, &sz)

после вызова, насколько я понимаю, в cl_addr занесутся данные того кто прислал сообщение.
мне нужно создать новый сокет забинденный к cl_addr и потом по нему вызывать select?

Это сообщение отредактировал(а) 4eJIoBekMoJIekyJIa - 26.5.2008, 20:11
--------------------
PM MAIL   Вверх
MAKCim
Дата 26.5.2008, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



4eJIoBekMoJIekyJIa, 
после получения пакета, отправляешь нужный пакет по адресу cl_addr
зачем тут select()?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0618 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.