У меня есть программа сетевого сервера, управляемая событиями.Эта программа принимает соединения от других процессов на других хостах.На одном и том же удаленном IP-адресе может быть много кратковременных соединений из разных портов.
В настоящее время у меня есть цикл while(1)
, который вызывает accept()
, а затем порождает поток для обработки нового соединения.Каждое соединение закрывается после прочтения сообщения.На удаленном конце соединение закрывается после отправки сообщения.
Я хочу устранить накладные расходы на установку и разрыв соединений, кэшируя FD с открытым сокетом.Со стороны отправителя это просто - я просто не закрываю соединения и держу их рядом.
Со стороны получателя это немного сложнее.Я знаю, что могу хранить FD, возвращенный accept()
в структуре, и прослушивать сообщения через все такие сокеты, используя poll()
или select()
, но я хочу одновременно и прослушивать новые соединения через accept()
и прослушивание всех кэшированных соединений.
Если я использую два потока, один на poll()
и один на accept()
, то при возврате вызова accept()
(открывается новое соединение),Я должен разбудить другой поток, ожидающий старого набора соединений.Я знаю, что могу сделать это с сигналом и pselect()
, но весь этот беспорядок кажется слишком большой работой для чего-то такого простого.
Существует ли метод вызова или превосходящая методика, которая позволит мне одновременно обрабатывать новые соединенияоткрывается и данные отправляются по старым соединениям?