2

私はソケットプログラミングに不慣れであり、研究でスキームを検証するために、UDPベースのレートレスファイル伝送システムを実装する必要があります。これが私がする必要があることです:

サーバーSがピアA、B、Cなどのグループにファイルを送信するようにします。ファイルはいくつかのパケットに分割されます。最初に、ピアは送信を初期化するためにサーバーに要求メッセージを送信します。Sはクライアントから要求を受信するたびに、エンコードされたパケットをレートレスで送信します(エンコード方法は私の設計で行われ、エンコード自体には消去修正機能があるため、UDPを介してレートレスで送信できます)。クライアントはパケットを収集し続け、それらをデコードしようとします。最終的にすべてのパケットをデコードしてファイルを正常に再構築すると、サーバーに停止メッセージが返され、Sはこのクライアントへの送信を停止します。

ピアはファイルを非同期的に要求します(異なる時間にファイルを要求する場合があります)。また、サーバーは複数のピアに同時にサービスを提供できる必要があります。異なるクライアントのエンコードされたパケットは異なります(ただし、それらはすべて同じセットのソースパケットからエンコードされます)。

これが私が実装について考えていることです。私はunixネットワークプログラミングの経験があまりないので、それを評価し、それが可能か効率的かどうかを確認するのを手伝ってくれるかどうか疑問に思っています。

  1. サーバーを2つのソケットポートを備えた同時UDPサーバーとして実装します(UNPブックによるTFTPと同様)。1つは、制御メッセージを受信することです。これは、私のコンテキストでは、要求メッセージと停止メッセージの場合と同じです。サーバーは、リクエストごとにフラグ(最初は= 1)を維持します。クライアントから停止メッセージを受信すると、フラグは0に設定されます。

  2. サーブはリクエストを受信すると、2番目のソケットとポートを使用してエンコードされたパケットをクライアントに送信する新しいプロセスをfork()します。フラグが1である限り、サーバーはクライアントにパケットを送信し続けます。フラグが0になると、送信は終了します。

  3. クライアントプログラムは簡単に実行できます。リクエストを送信し、サーバーをrecvfrom()し、ファイルを段階的にデコードして、最後に停止メッセージを送信するだけです。

このデザインは実行可能ですか?私が抱えている主な懸念事項は次のとおりです。(1)、複数のプロセスをフォークすることで効率的ですか?または、スレッドを使用する必要がありますか?(2)、複数のプロセスを使用する必要がある場合、子プロセスはフラグビットをどのように知ることができますか?コメントしてくれてありがとう。

4

2 に答える 2

0

UDPを使用したファイル転送は楽しいでしょう:(

各メッセージの構造体/クラスには、シーケンス番号とチェックサムが含まれている必要があります。これにより、各クライアントは、転送の最後に欠落しているブロックを検出し、再送信を要求できるようになります。

UDPが大きな勝者となる可能性があるのは、ローカルLANです。ファイル全体を一度にすべてのクライアントにUDPブロードキャストし、最後に、各クライアントに、欠落しているブロックを順番に尋ねて、それらだけを送信することができます。Kasperskyなどが私のすべてのローカルボックスを更新するためにそのようなスキームを使用することを望みます。

私は、新しい画像をダウンロードする必要のあるマイクロコントローラーが数十あるCANBUSネットワークでこのようなブロードキャストスキームを使用しました。ソフトウェアのアップグレードには、数時間ではなく数分かかります。

于 2012-04-17T18:00:58.580 に答える
0

ファイル転送にUDBを使用するのは最善の方法ではありません。サーバーまたはクライアントがパケットが失われたかどうかを知る方法はないため、失われたパックを検出するための何らかのメカニズム(カウンターなど)があると仮定すると、再構築中にのみそれを知ることができます。その場合、失われたパケットの1つだけを要求することは困難です。そして最終的には、TCPソケットが行うことを行うコードができあがります。したがって、TCPから始めることをお勧めします。

サーバーの一般的な設計には、新しいクライアント要求があるたびにワーカースレッドを生成するリスナースレッドが含まれます。その新しいスレッドは、その特定のクライアントとの通信を処理してから終了します。同時に提供されるクライアント(スレッド)の制限を維持する必要があります。クライアントごとに新しいプロセスを生成しないでください。これは非効率的であり、スレッドでは達成できないことは何も得られないため、必要ありません。

スレッドプログラミングには注意が必要なので、角を切らないでください。そうしないと、問題を見つけて診断するのに苦労するでしょう。

于 2012-04-17T17:43:09.797 に答える