こんにちは。
少し話が混乱しているように感じます。
UDPサーバも普通に複数のクライアントからの要求を処理できますよ。
ご存知のようにTCPとの大きな違いの1つとしてコネクションを張らないことがありますね。
これが何を意味するかと言うと、TCPは同一のクライアントとコネクションを張ることで「継続」して通信できます。しかし、UDPはコネクションの概念がないので同一のクライアントから受信した時、それを以前に受け付けた要求と関連付けることができないことです。つまり、単発の処理要求に応答する部分までしかプロトコル・スタックがサポートしていないと言うことです。
もし、同一のクライアントからの「継続」した要求であることを認識する必要があるのであれば、アプリ側でクライアントのIPアドレスとポート番号を使って同一のクライアントを判別することが考えられます。きちんとコネクション接続と切断をアプリ側のプロトコルで取り決めて「コネクション」を管理すれば問題ないのではないでしょうか? ここまでなら、ユーザ識別子=クライアントのIPアドレス+ポート番号とし、recvしたバケットのそれらに応じて当該クライアント向けの継続処理し、終わったらrecv待ちすればよいと思います。
次に、その継続処理に時間がかかる場合はサブ・スレッドにて処理するのが一般的と思います。(C10Kのようなケースを除く)その場合に、当初のポートと同じポートを使い続ける方法と、クライアント毎にサーバ側で別途ポートを開く方法が考えられます。前者はかなり面倒なので私なら後者を使います。
C10K問題を考慮しない限り、どちらの場合でもrecvで十分と思います。
前者ならrecv後、そのクライアント用に処理をしているスレッドへ何らかのスレッド間通信で処理依頼するか、スレッド・プールのスレッドを使ってその処理を依頼後、直ぐにrecv継続ですね。結構面倒です。
後者ならメインのポートをrecvしているスレッドでコネクション要求を処理し、要求があったらサブ・スレッドを起動して処理を依頼後、直ぐにrecv継続です。サブ・スレッドはコネクション接続処理の残り(自分用のソケット生成含む)~コネクション切断(自分用のソケット破棄含む)まで担うイメージです。