По сути, вы хотите, чтобы ваш основной поток выполнял только часть принятия, а затем обрабатывал остальное другим потоком выполнения (который может быть потоком или процессом).
Всякий раз, когда ваш основной поток возвращается из«принять», передать дескриптор сокета другому потоку и вызвать снова вызов (это можно сделать с помощью fork, с помощью pthread_create или путем поддержки пула потоков и использования синхронизации, например, переменных условия, чтобы указать, что новый клиент былпринято).
В то время как основной поток будет обрабатывать возможные новые входящие клиенты, другие потоки будут обрабатывать recv / send.