BSDPORTAL.RU

На этом сайте обсуждаются вопросы использования ОС FreeBSD
 Портал  •  Статьи  •  Форум  •  Wiki  •  Поиск  •  FAQ  •  Обои  •   Официальная документация  •  Новые темы 

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: UDP-сокеты с одинаковым портом
СообщениеДобавлено: Ср 12 сен, 2018 1:25 am 
Не в сети

Зарегистрирован: Чт 03 янв, 2008 3:16 pm
Сообщения: 187
Откуда: Москва
Привет, All!

Пишу под Фрёй маленькую программку, которая должна слушать мультикасты (UDP). В сокетах особо не разбираюсь, поэтому тупо скопипастил какой-то пример из интернетов. В нём, среди прочего, есть вот такой фрагмент:
Код:
      u_int yes=1;

      /* allow multiple sockets to use the same PORT number */
      if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0) {
         perror("Reusing ADDR failed");
         exit(1);
      }


И тем не менее, если я запускаю параллельно две копии программы и заставляю слушать их разные мультикасты с одним и тем же портом (напр., 235.5.2.6:1234 и 235.5.2.211:1234), то более поздний экземпляр программы тут же вываливается с ошибкой bind: Address already in use.

Как это можно побороть?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UDP-сокеты с одинаковым портом
СообщениеДобавлено: Ср 12 сен, 2018 7:34 pm 
Не в сети
Модератор

Зарегистрирован: Сб 11 сен, 2004 6:33 am
Сообщения: 5204
Откуда: Москва
SO_REUSEPORT


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UDP-сокеты с одинаковым портом
СообщениеДобавлено: Пн 01 окт, 2018 3:01 pm 
Не в сети

Зарегистрирован: Чт 03 янв, 2008 3:16 pm
Сообщения: 187
Откуда: Москва
Спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UDP-сокеты с одинаковым портом
СообщениеДобавлено: Пн 01 окт, 2018 6:10 pm 
Не в сети

Зарегистрирован: Чт 03 янв, 2008 3:16 pm
Сообщения: 187
Откуда: Москва
Нет, что-то не помогает :( Или я что-то не так делаю... SO_REUSEPORT следует использовать вместо SO_REUSEADDR или вместе с ним?
Как вообще дебажить подобные ситуации?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UDP-сокеты с одинаковым портом
СообщениеДобавлено: Пн 01 окт, 2018 8:46 pm 
Не в сети
Модератор

Зарегистрирован: Сб 11 сен, 2004 6:33 am
Сообщения: 5204
Откуда: Москва
Abyrvalg писал(а):
Или я что-то не так делаю...

Что-то не так делаете. Надеюсь, вы зовёте setsockopt до bind()?

Abyrvalg писал(а):
SO_REUSEPORT следует использовать вместо SO_REUSEADDR или вместе с ним?

Не знаю при чём тут SO_REUSEADDR вообще.

Abyrvalg писал(а):
Как вообще дебажить подобные ситуации?

Не вижу что тут можно было бы "дебажить".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UDP-сокеты с одинаковым портом
СообщениеДобавлено: Вт 02 окт, 2018 1:50 pm 
Не в сети

Зарегистрирован: Чт 03 янв, 2008 3:16 pm
Сообщения: 187
Откуда: Москва
Вот фрагмент подключения к мультикасту. Передрано откуда-то из интернетов.

Код:
      struct sockaddr_in addr;
      int fd, nbytes,addrlen;
      struct ip_mreq mreq;

      u_int yes=1;

      /* create what looks like an ordinary UDP socket */
      if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) {
         perror("socket");
         exit(1);
      }

      /* allow multiple sockets to use the same PORT number */
      if (setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,&yes,sizeof(yes)) < 0) {
         perror("Reusing ADDR failed");
         exit(1);
      }

      /* set up destination address */
      memset(&addr,0,sizeof(addr));
      addr.sin_family=AF_INET;
      addr.sin_addr.s_addr=htonl(INADDR_ANY); /* N.B.: differs from sender */
      addr.sin_port=htons(port);

      /* set up timeout*/
      struct timeval timeout;
      timeout.tv_sec = SOCKET_TIMEOUT;
      timeout.tv_usec = 0;
      if (setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,&timeout,sizeof(timeout)) < 0) {
         perror("setsockopt");
         exit(1);
      }

      /* bind to receive address */
      if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0) {
         perror("bind");
         exit(1);
      }

      /* use setsockopt() to request that the kernel join a multicast group */
      mreq.imr_multiaddr.s_addr=inet_addr(mcast);
      mreq.imr_interface.s_addr=htonl(INADDR_ANY);
      if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0) {
         perror("setsockopt");
         exit(1);
      }


Валится на стадии bind с известной фразой, что, мол, bind: Address already in use.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UDP-сокеты с одинаковым портом
СообщениеДобавлено: Вт 02 окт, 2018 5:23 pm 
Не в сети
Модератор

Зарегистрирован: Сб 11 сен, 2004 6:33 am
Сообщения: 5204
Откуда: Москва
УМВР (https://github.com/amdmi3/udptest/tree/reuseport).


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Зарегистрированные пользователи: Bing [Bot], Google [Bot], Majestic-12 [Bot]


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

Найти:
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB
Яндекс.Метрика