2

サーバー プログラムとクライアント プログラムを作成する実習を行っています。QNX OS 上にあります。Linux で動作するかどうかは不明です。概要は次のとおりです。

「C プログラム msgSender.c と msgLogger.c のペアを作成して、プロセス間での Neutrino メッセージの受け渡しを示します。

プログラムはシェルから次のように呼び出されます。

$ msgLogger logFileName $ msgSender msgLogger

logFileName は、メッセージを保存するログの名前です

msgLogger プロセスは、ロガーとして機能します。メッセージを受信し、メッセージをファイルに書き込みます。

  1. msgLogger は、msg.h に示されている形式のテキストベースのメッセージを受け取ります。メッセージ ヘッダーをテストし、メッセージ タイプが MSG_DATA の場合にのみメッセージ テキストを logFile に書き込む必要があります。
  2. MSG_DATA を受信した場合、応答ステータスは MSG_OK です。
  3. MSG_END を受信すると、サーバーは MSG_END のステータスで応答し、クリーンアップして終了します。
  4. 受信したメッセージが MSG_DATA または MSG_END でない場合、応答ステータスは MSG_INVALID になり、メッセージ テキストはログに記録されません。警告メッセージが記録されます。
  5. このプロセスは、その ND PID CHID を msgLogger.pid という名前のファイルに書き込むことによって、その存在をアドバタイズします。ここで、ファイル名の「msgLogger」部分は argv[0] から取得されます。
  6. ログに記録されたメッセージには、時刻と送信者の ND PID COID がスタンプされます。

msgSender は、テキストベースのメッセージを組み立てて送信する対話型プログラムです。

  1. コマンド ラインからロガー プロセスの名前を読み取り、この名前を使用して、ND PID CHID を読み取る .pid ファイルの名前を作成します。
  2. ユーザーにメッセージ ヘッダーの種類と、メッセージのテキストの入力を求めるプロンプトが表示されます。
  3. サーバーから MSG_END を受信すると終了します。
  4. サーバーから MSG_INVALID を受信した場合、警告を出力します。

    • あなたのクライアントとサーバーは、私のクライアントとサーバーと相互運用する必要があります。
    • サーバーが複数の同時クライアントで適切に動作することを検証します。
    • 各ロギング メッセージの後にサーバーのファイル書き込みバッファをフラッシュする場合は、バックグラウンドで実行し、$ tail -f logFile を使用して受信したメッセージを表示できます。
    • コマンドライン引数の有効性を必ず確認してください。
    • グローバル変数は必要な場合にのみ使用してください。"

msgLogger は完全に機能しています。ここにコードがあります: http://pastebin.com/8AGfGZ5u

そして、ここに msg.h ファイルがあります: http://pastebin.com/3xcBZvnH

そして、ここに私がこれまでに持っている msgSender のコードがあります: http://pastebin.com/Buk88Kry

送信者 (クライアント) が行う必要があるのは、ユーザーが数字を使用してメッセージ タイプを入力できるようにすることです。msg.h ファイルには、MSG_DATA が 1 などのメッセージ番号のタイプが含まれています。無効な数字を入力すると、再試行するように求められます。そうでない場合は、その数字を保存して、メッセージの amsg.m_hdr に割り当てます。メッセージ構造体。amsg.m_data は、メッセージの値です。

次に、ユーザーが必要なメッセージを入力し、数字 1 (msg_data) を選択した場合、サーバーは通知を送信し、クライアントは「メッセージが正常に受信されました」と出力し、メッセージの内容はログ ファイルに保存されます。

残念ながら、私はたくさんの問題を抱えており、メッセージを記録していません。明日、msgSender を提出する必要があります。これは、次のラボにも依存します。これについて何らかの助けが得られることを本当に願っています。

4

1 に答える 1

0

クライアントの書き込み後にバッファをフラッシュしてみてください。ファイルへの書き込み中にファイル記述子を閉じない場合、バッファーがフラッシュされ、ファイルが書き込まれたという保証はありません。fsync() を呼び出すことで、必要なときにすべての書き込みがファイルに同期されるようにすることができます。

于 2013-05-10T14:44:34.247 に答える