В настоящее время я изучаю программирование сокетов с использованием C в среде Linux.В качестве проекта я пытаюсь написать базовый чат-сервер и клиент.
Цель состоит в том, чтобы сервер развернул процесс для каждого подключенного клиента.
Проблема, с которой я сталкиваюсь, - это чтение данных одного ребенка и запись их всем подключенным клиентам.
Я пытался выполнить это, зацикливаясь на вызове для выбора дочернего объекта, который ожидает поступления данных в сокет или конец чтения канала.Если он поступает в сокет, идея состоит в том, что он записывает в конец канала записи, что заставляет select возвращать конец чтения канала как готовый к чтению.
Поскольку этот канал является общим для всех дочерних элементовЗатем каждый ребенок должен прочитать данные на канале.Это не работает, поскольку конвейер данных, оказывается, не может быть прочитан каждым дочерним процессом одновременно и дочерними процессами, которые «пропускают» блок данных в вызове read.
Ниже приведен код в дочернем процессе, который делает это:
for( ; ; )
{
rset = mset;
if(select(maxfd+1, &rset, NULL, NULL, NULL) > 0)
{
if(FD_ISSET(clientfd, &rset))
{
read(clientfd, buf, sizeof(buf));
write(pipes[1], buf, strlen(buf));
}
if(FD_ISSET(pipes[0], &rset))
{
read(pipes[0], buf, sizeof(buf));
write(clientfd, buf, sizeof(buf));
}
}
}
Я предполагаю, что метод, который я использую в настоящее время, просто не будет работать.Будет ли возможно, чтобы сообщения, полученные от клиента, были записаны всем другим подключенным клиентам через IPC?
Спасибо