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