Работа с AF_UNIX SOCK_DGRAM SO_BROADCAST сокетом

Работа с AF_UNIX SOCK_DGRAM SO_BROADCAST сокетом

09.06.2014 03:53:50 Просмотров 34 Источник

Здравствуйте, пишу чатик, начал с параллельного эхо-сервера. Теперь пытаюсь сделать так, чтобы сообщения от одного подключенного клиента рассылались всем подключенным клиентам. В процессе-родителе создаю сокет в файловом пространстве, и делаю его широковещательным:

  int commfd;
  struct sockaddr commaddr;

  if( ( commfd = socket( AF_UNIX, SOCK_DGRAM, 0 ) ) < 0 )
    perror( "error in common socket" );

  bzero( &commaddr, sizeof( commaddr ) );
  commaddr.sa_family = AF_UNIX;
  strcpy( commaddr.sa_data, COMM_SOCK_NAME );

  if( bind( commfd, &commaddr, sizeof( commaddr ) ) < 0 )
    perror( "error in bind for commfd" );

  int n=1;
  if( setsockopt( commfd, SOL_SOCKET, SO_BROADCAST, &n, sizeof(n) ) < 0 )
    perror( "error in setsockopt" );

И в дочернем процессе-обработчике клиента подключаюсь к этому сокету, и через select жду, пока сокет этот будет доступен на чтение.

В общем суть задумки: клиент пишет сообщение серверу (а на сервере для этого клиента свой процесс-обработчик), это сообщение отсылается назад этому же клиенту, и это же сообщение пишется в широковещательный сокет. В это же время процессы - обработчики других клиентов ждут того самого сообщения, принимают, и выводят на экран.

Но не срабатывает select в обработчике, что я не так делаю?

Весь код сервера здесь: http://paste.ubuntu.com/7617694/

У вопроса есть решение - Посмотреть?

Ответы - Работа с AF_UNIX SOCK_DGRAM SO_BROADCAST сокетом / Работа с AF_UNIX SOCK_DGRAM SO_BROADCAST сокетом

sercxjo

25.05.2016 08:18:11

UNIX-cокеты не поддерживают широковещательную передачу. Приём-передача широковещательных udp-пакетов осуществляется с использованием (кроме опции SO_BROADCAST) широковещательных адресов, которые не предусмотрены в AF_UNIX. Так же невозможно забиндить более одного сокета на один AF_UNIX-адрес, что потребовалось бы для приёма.

Закрыть X