#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-адрес, что потребовалось бы для приёма.
Комментариев нет:
Отправить комментарий