Модераторы: 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   Вверх
4eJIoBekMoJIekyJIa
Дата 27.5.2008, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ну просто у меня есть несколько клиентов, recvfrom о котором я писал выше нужен чтобы установить соединение, после этого сервер должен отправить всем подключенным клиентам сообщение(скорее всего широковещательное), дальше клиенты отвечают, мне нужно определить кто первым ответил, для этого я и хочу использовать select.
ЗЫ: когда я отправляю бродкаст он на мой комп не приходит?Можноли как-нибудь сделать чтобы приходило? Если нет, то не понятно как тестить...

Это сообщение отредактировал(а) 4eJIoBekMoJIekyJIa - 27.5.2008, 03:40
--------------------
PM MAIL   Вверх
MAKCim
Дата 27.5.2008, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(4eJIoBekMoJIekyJIa @  27.5.2008,  00:08 Найти цитируемый пост)
дальше клиенты отвечают, мне нужно определить кто первым ответил, для этого я и хочу использовать select.

через select() ты никак не определишь, кто ответил первым
Цитата(4eJIoBekMoJIekyJIa @  27.5.2008,  00:08 Найти цитируемый пост)
Можноли как-нибудь сделать чтобы приходило?

нет
Цитата(4eJIoBekMoJIekyJIa @  27.5.2008,  00:08 Найти цитируемый пост)
Если нет, то не понятно как тестить...

раскидать клиентов по разным портам и работать через loopback-интерфейс

Добавлено через 33 секунды
а вообще не мешало бы услышать задачу полностью
что на входе, что на выходе


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

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


Шустрый
*


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

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



Задача такая: есть бабушка(сервер) которая кидает зерна, и n воробьев, которые хотят их схватить(клиенты), если воробей схватил зерно, то следующий розыгрыш он пропускает.

Сначала я реализовал через потоки, но преп сказал что если он захочет запустить 1000 клиентов то столько потоков не создастся, и посоветовал делать через бродкаст всё в одном потоке.

Цитата(MAKCim @  27.5.2008,  09:17 Найти цитируемый пост)
через select() ты никак не определишь, кто ответил первым


потомучто когда выполниться селект уже может прийти несколько ответов? А как тогда определить кто первый?


Цитата(MAKCim @  27.5.2008,  09:17 Найти цитируемый пост)
раскидать клиентов по разным портам и работать через loopback-интерфейс


а это как?

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


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


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

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



4eJIoBekMoJIekyJIa, 
где конкретно будут располагаться клиенты? (хост, LAN, глобальная сеть)



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

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


Шустрый
*


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

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



все на одном компе

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


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


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

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



4eJIoBekMoJIekyJIa, 
1. что мешает вызывать recvfrom() до получения ответов ото всех клиентов?
первый вызов recvfrom() будет соответствовать первому ответившему клиенту
2. на хосте широковещательную (и многоадресную) передачу организовать нельзя



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

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


Шустрый
*


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

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



Ладно. А одновременно отправить как-нибудь подругому можно?

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


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


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

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



Цитата(4eJIoBekMoJIekyJIa @  27.5.2008,  12:33 Найти цитируемый пост)
Ладно. А одновременно отправить как-нибудь подругому можно?

нет, т. к в рамках хоста все клиенты будут "сидеть" на разных портах


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

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


Шустрый
*


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

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



слушай смотри если есть такой код
Код

    conn_sock = socket(AF_INET, SOCK_DGRAM, 0);

    bzero(&srv_addr, sizeof(srv_addr));
    srv_addr.sin_family = AF_INET;
    srv_addr.sin_port = 11000;
    
    if(inet_aton(argv[1], &srv_addr.sin_addr) == 0)

    sendto(conn_sock, line, strlen(line), 0, (sockaddr *)&srv_addr, sizeof(srv_addr));

и у меня на сервере вызывается 
Код

        recvfrom(work_sock,buffer,BUF1, 0, (sockaddr *)&cl_addr, &sz)

какой порт занесется в cl_addr? или там будет пусто?

Цитата

нет, т. к в рамках хоста все клиенты будут "сидеть" на разных портах

насколько я понимаю лупбэк интерфейс какбы создает новый сетевой интерфейс, а как его создать?

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


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


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

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



Цитата(4eJIoBekMoJIekyJIa @  27.5.2008,  14:51 Найти цитируемый пост)
какой порт занесется в cl_addr? или там будет пусто?

порт клиента (назначается динамически в момент отправки пакета клиентом)
Цитата(4eJIoBekMoJIekyJIa @  27.5.2008,  14:51 Найти цитируемый пост)
насколько я понимаю лупбэк интерфейс какбы создает новый сетевой интерфейс, а как его создать?

не понял вопроса
loopback - виртуальный сетевой интнрфейс (не соответствет никакому NIC)
создавать ничего не надо, он является частью сетевой подсистемы ядра
доступен через символьный идентификатор lo


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

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


Шустрый
*


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

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



Цитата(MAKCim @  27.5.2008,  09:17 Найти цитируемый пост)
раскидать клиентов по разным портам и работать через loopback-интерфейс

не понял как это...объясни пожалуйста



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


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


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

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



Цитата(4eJIoBekMoJIekyJIa @  27.5.2008,  21:14 Найти цитируемый пост)
не понял как это...объясни пожалуйста

делать bind() на сокетах клиентов
(или ничего не делать: порт назначит ядро)
все пакеты отсылать на 127.0.0.1


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

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


Шустрый
*


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

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



Цитата(MAKCim @  27.5.2008,  23:19 Найти цитируемый пост)
все пакеты отсылать на 127.0.0.1 

Если просто выслать на 127.0.0.1 онж не перешлется всем сокетам клиентам.
--------------------
PM MAIL   Вверх
MAKCim
Дата 28.5.2008, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(4eJIoBekMoJIekyJIa @  28.5.2008,  09:45 Найти цитируемый пост)
Если просто выслать на 127.0.0.1 онж не перешлется всем сокетам клиентам. 

клиенты отсылают пакеты серверу на 127.0.0.1
сервер отсылает пакеты клиентам на 127.0.0.1 с указанием портов клиентов (из cl_addr)


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

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


Шустрый
*


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

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



Цитата(MAKCim @  28.5.2008,  10:07 Найти цитируемый пост)
сервер отсылает пакеты клиентам на 127.0.0.1

ну в моей задаче такое не катит(сервер ведь будет поочереди отсылать на каждый порт),а мне  нужно чтобы всем клиентам приходило одновременно...
смотри а если я буду биндить клиенты на 127.0.0.2 127.0.0.3 итд и отправлять бродкаст на 127.0.0.255 они его получат?
--------------------
PM MAIL   Вверх
MAKCim
Дата 1.6.2008, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(4eJIoBekMoJIekyJIa @  31.5.2008,  23:51 Найти цитируемый пост)
смотри а если я буду биндить клиенты на 127.0.0.2 127.0.0.3 итд и отправлять бродкаст на 127.0.0.255 они его получат? 

хотя да, должно работать
только не 127.0.0.255, а 127.255.255.255


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

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


Шустрый
*


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

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



во и я так же подумал, но почему то ничего не принимаеться может это особенности того что у меня линукс на виртуальной машине стоит и там сеть не настроена(хотя поидее на адреса 127.х.х.х это не влияет)
вот начало кода сервера, он биндится на 11000 порт а шлет бродкаст на 4004
Код

int main(int argc, char** argv)
{
    struct sockaddr_in cl_addr, first_addr, srv_addr;
    char msg[BUF1];
    int yes = 1, work_sock, first, corn_num = 0;

    struct timeval t;
    t.tv_sec = 2;
    t.tv_usec = 0;
    
    fd_set fd;

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

    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 = htons(11000);

    bzero(&broad_addr, sizeof(broad_addr));
    broad_addr.sin_family = AF_INET;
    broad_addr.sin_port = htons(4004);

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

    if(bind(work_sock ,(sockaddr *)&srv_addr, sizeof(srv_addr)) < 0) {
        cout<<"bind error "<<strerror(errno)<<endl;
        close(work_sock);
        return 0;
    }
    if(setsockopt(work_sock, SOL_SOCKET, SO_BROADCAST,(char *) &yes,  sizeof(yes)) < 0)
    {
        cout<<"set sock opt error "<<strerror(errno)<<endl;
        close(work_sock);
        exit(-1);
    }
    fcntl(work_sock, F_SETFL, O_NONBLOCK);
    while(1)
    {
        cout<<endl<<endl<<"start"<<endl;
        corn_num++;
        first = 1;
        client_addr.clear();

        FD_ZERO(&fd);
        FD_SET(work_sock, &fd);
        
        t.tv_sec = 2;
        t.tv_usec = 0;

        bzero(msg, BUF1);
        sprintf(msg, "%d", corn_num);

        if(sendto(work_sock, msg, strlen(msg), 0, (sockaddr *)&broad_addr, sizeof(broad_addr)) < 0)
        {
            cout<<"sendto error  "<<strerror(errno)<<endl;
            close(work_sock);
            exit(-1);
        }

        cout<<"sended broadcast mes"<<t.tv_sec<<endl; 



клиент биндится на 4004 порт и опишник, тот который указывается на входе, и ждет сообщения. Вот начало 
Код

int main(int argc, char** argv)
{
    int work_sock, corns_left = NUM1, yes = 1, miss = 0;
    struct sockaddr_in  my_addr,  srv_addr;
    char msg[BUF1];
    char chk[BUF1] = "first\0";
    fd_set fd;
    struct timeval t;
    t.tv_sec = 5;
    t.tv_usec = 0;
    
        if(argc == 1)
    {
        cout << "error: wrong data entered!"<<endl;
        return 0;
    }
    
    work_sock = socket(AF_INET, SOCK_DGRAM, 0);

    bzero(&my_addr, sizeof(my_addr));
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(4004);
    
    if(inet_aton(argv[1], &my_addr.sin_addr) == 0) {
        cout<<"wrong data"<<endl;
        close(work_sock);
        exit(-1);
    }
    if(bind(work_sock ,(sockaddr *)&my_addr, sizeof(my_addr)) < 0)
    {
        cout<<"bind error "<<strerror(errno)<<endl;
        close(work_sock);
        return 0;
    }
    if(setsockopt(work_sock, SOL_SOCKET, SO_BROADCAST,(char *) &yes,  sizeof(yes)) < 0)
    {
        cout<<"set sock opt error "<<strerror(errno)<<endl;
        close(work_sock);
        exit(-1);
    }
    while(1)
    {
        FD_ZERO(&fd);
        FD_SET(work_sock, &fd);

        bzero(msg, BUF1);
        socklen_t sz = sizeof(srv_addr);
        bzero(&srv_addr, sizeof(srv_addr));
        cout<<"receiving..."<<endl;
        if(recvfrom(work_sock, msg, BUF1, 0,(struct sockaddr *) &srv_addr, &sz) < 0)
        {
            cout<<"recieve error"<<strerror(errno)<<endl;
            close(work_sock);
            exit(-1);
        }
        cout<<"read, corn num is  "<<msg<<"  corns left  "<<corns_left<<endl; 


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


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


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

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



4eJIoBekMoJIekyJIa, 
посмотри через 
Код

# ifconfig lo

есть ли поддержка широковещательной передачи на интерфейсе


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

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


Шустрый
*


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

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



походу нет, тока адрес написан и маска. А как сделать поддержку?
--------------------
PM MAIL   Вверх
MAKCim
Дата 2.6.2008, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(4eJIoBekMoJIekyJIa @  2.6.2008,  12:42 Найти цитируемый пост)
походу нет, тока адрес написан и маска. А как сделать поддержку? 

с ходу не скажу


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

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


Шустрый
*


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

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



лан уже не срочно впринцыпе

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


Шустрый
*


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

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



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

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

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


 




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


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

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