#c #сокет #unix #select #unix_socket
Здравствуйте, пишу чатик, начал с параллельного эхо-сервера. Теперь пытаюсь сделать так, чтобы сообщения от одного подключенного клиента рассылались всем подключенным клиентам. В процессе-родителе создаю сокет в файловом пространстве, и делаю его широковещательным: 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/
Ответы
Ответ 1
UNIX-cокеты не поддерживают широковещательную передачу. Приём-передача широковещательных udp-пакетов осуществляется с использованием (кроме опции SO_BROADCAST) широковещательных адресов, которые не предусмотрены в AF_UNIX. Так же невозможно забиндить более одного сокета на один AF_UNIX-адрес, что потребовалось бы для приёма.
Комментариев нет:
Отправить комментарий