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], Google Feedfetcher


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

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