0

recvfrom() を使用して、受信したパケットごとにパケットを受信する単純な UDP サーバー プログラムを作成したいと思います。プログラムはそれを処理します。元のソース コードは次のようになります。

for(;;){
n = recvfrom(sockfd, mesg, 10000, 0 ptr_sockaddr, &len);
process(mesg);
}

しかし、このように、process()関数が少し時間がかかると、recvfrom(). そのため、新しいプロセスまたは新しいスレッドを作成する必要があり、

  1. このシナリオにはどちらが適していますか? スレッドまたはプロセス?なぜ?
  2. mesgプロセス間またはスレッド間通信をどのように処理するかというと、新しいプロセス (またはスレッド) に文字列を渡す必要があるということです。また、パケットの受信が処理よりもはるかに速い場合、どのようなバッファリング方法を使用すればよいですか?

いくつかのソース コード スニペットを提供できる場合は、そのほうがよいでしょう。

ありがとう!

4

5 に答える 5

1

ループするスレッドを 1 つ持つことをお勧めしますrecvfrom。データグラムを受信したら、そのデータグラムをキューに入れます。次に、キューからデータグラムをプルして処理するスレッドのプールを作成できます。

通常の解決策は、キューを保護するミューテックスと条件変数を用意することです。キューへのアイテムの追加は、次のように機能します。

  1. ミューテックスを取得します。

  2. アイテムをキューに追加します。

  3. 条件変数を通知します。

  4. ミューテックスを解放します。

そして、プール内のスレッドはこれを行います:

  1. ミューテックスを取得します。

  2. キューに項目がある場合は、手順 5 に進みます。

  3. ミューテックスを解放する条件変数をブロックします。

  4. 手順 2 に進みます。

  5. アイテムをキューから削除します。

  6. ミューテックスを解放します。

  7. キューから削除したアイテムを処理します。

  8. 手順 1 に進みます。

ただし、キューが無限に大きくなるのを防ぎたい場合があります。データグラムを処理するよりも速く受信する可能性は常にあり、キューのメモリ使用量が増加し続けることはお勧めできません。

于 2013-03-27T16:45:44.963 に答える
0

データを含む構造体を宣言します。マロックワン。メッセージで読んでください。*struct を待ち行列に入れ、すぐに次のメッセージのために別のものを malloc (またはデプール) します。コンシューマでの処理後に *struct を解放または再プールします。

次のいずれかでフロー制御を行うことができます。

1) 制限付きブロッキング キューを使用し、処理後にコンシューマー側で *struct を解放します。

2) 2 つの無制限のブロッキング キューを使用する - 1 つは *struct で事前に入力されてプールとして機能し、もう 1 つはスレッド間で通信します。recvFrom スレッドが *struct を必要とする場合は、プールからポップします。コンシューマーが *struct を処理したら、それをプールにプッシュします。

于 2013-03-27T16:53:44.913 に答える
0

スレッドはその親プロセスのメモリを見ることができるため、スレッドの使用はより簡単です。そのため、変数とメモリにアクセスし、それらを読み取って変更できます。

プロセスを使用すると、親プロセスのメモリに直接書き込みでアクセスすることはできません。共有メモリ(mmap)などの親プロセスの変数とメモリを変更するには、他の方法を使用する必要があります。

于 2013-03-27T16:45:40.673 に答える