BSDPORTAL.RU
http://bsdportal.ru/

UDP-сокеты с одинаковым портом
http://bsdportal.ru/viewtopic.php?f=59&t=28806
Страница 1 из 1

Автор:  Abyrvalg [ Ср 12 сен, 2018 1:25 am ]
Заголовок сообщения:  UDP-сокеты с одинаковым портом

Привет, 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.

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

Автор:  AMDmi3 [ Ср 12 сен, 2018 7:34 pm ]
Заголовок сообщения:  Re: UDP-сокеты с одинаковым портом

SO_REUSEPORT

Автор:  Abyrvalg [ Пн 01 окт, 2018 3:01 pm ]
Заголовок сообщения:  Re: UDP-сокеты с одинаковым портом

Спасибо.

Автор:  Abyrvalg [ Пн 01 окт, 2018 6:10 pm ]
Заголовок сообщения:  Re: UDP-сокеты с одинаковым портом

Нет, что-то не помогает :( Или я что-то не так делаю... SO_REUSEPORT следует использовать вместо SO_REUSEADDR или вместе с ним?
Как вообще дебажить подобные ситуации?

Автор:  AMDmi3 [ Пн 01 окт, 2018 8:46 pm ]
Заголовок сообщения:  Re: UDP-сокеты с одинаковым портом

Abyrvalg писал(а):
Или я что-то не так делаю...

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

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

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

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

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

Автор:  Abyrvalg [ Вт 02 окт, 2018 1:50 pm ]
Заголовок сообщения:  Re: UDP-сокеты с одинаковым портом

Вот фрагмент подключения к мультикасту. Передрано откуда-то из интернетов.

Код:
      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.

Автор:  AMDmi3 [ Вт 02 окт, 2018 5:23 pm ]
Заголовок сообщения:  Re: UDP-сокеты с одинаковым портом

УМВР (https://github.com/amdmi3/udptest/tree/reuseport).

Страница 1 из 1 Часовой пояс: UTC + 4 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/