ctrl_sock
control( ) 用と data transmission( )用の 2 つのソケットを保持する UDP ベースのサーバーを実装しようとしていますdata_sock
。ctrl_sock
問題は、常にアップリンクであり、ダウンリンクであるということですdata_sock
。つまり、クライアントは を介してデータの送信/停止を要求しctrl_sock
、データは を介してクライアントに送信されますdata_sock
。
ここでの問題は、モデルがコネクションレスであるため、サーバーは登録されたクライアントの情報のリスト (私はそれと呼んでいますpeers_context
) を維持する必要があり、クライアントが停止を要求するまでデータを「盲目的に」プッシュできるようにすることです。このブラインド送信中に、クライアントは を介してctrl_sock
非同期的に制御メッセージをサーバーに送信できます。これらの情報は、最初の Request と Stop の他に、ファイル パーツの設定などにも使用できます。したがって、 はpeers_context
非同期で更新する必要があります。ただし、 を介した送信はdata_sock
この構造に依存しているため、 と の間でpeers_context
同期の問題が発生します。私の質問は、これら 2 つのソックスと、ctrl_sock
data_sock
peers_context
peers_context
大混乱を引き起こしません。ところで、 の更新はpeers_context
それほど頻繁ではないため、要求と応答のモデルを避ける必要があります。
実装に関する私の最初の考慮事項は、ctrl_sock をメイン スレッド (リスナー スレッド) でdata_sock
維持し、転送を他のスレッド (ワーカー スレッド) で維持することです。ただし、この場合は同期が難しいことがわかりました。たとえば、 でミューテックスを使用するとpeers_context
、ワーカー スレッドが をロックするたびに、peers_context
を変更する必要があるときにリスナー スレッドがアクセスできなくなりますpeers_context
。これは、ワーカー スレッドが際限なく動作するためです。一方、リスナー スレッドが を保持しpeers_context
て書き込みを行うと、ワーカー スレッドは読み取りに失敗してpeers_context
終了します。誰か私にいくつかの提案をしてもらえますか?
ちなみに、実装はC言語のLinux環境で行っています。リスナースレッドだけはpeers_context
時々変更する必要があり、ワーカースレッドは読み取るだけで済みます。心から感謝します!