0

編集:これがコード全体です。ルーマニア語のコメントは無視してください。また、2つまたは3つの名前はルーマニア語から翻訳されていません:http://pastebin.com/JjtayvXX

OSの基本を学ぼうとしていますが、現在はウィンドウの下で名前付きパイプを使用していますが、何が問題なのかわかりません。

正直なところ、私は友人が行った例に取り組んでいますが、彼は私と同じくらい悪いです。hiのプログラムは機能しますが(何か他のことをしますが)、彼は何も説明できません。おそらくどこかからコピーされただけですが、それでも...重要ではありません。 。

サーバーはクライアントからメッセージを受信し、最大数と最小数を返します。

Server.c:

#include "windows.h"
#include "stdio.h"

struct Msg {
int numbers[20];
int length;
};

...

int main () {

HANDLE inputPipe, outputPipe; 
Msg msg;

while (true) {

inputPipe = CreateNamedPipe ("\\\\.\\pipe\\Client2Server",
                 PIPE_ACCESS_INBOUND,
                 PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 
                 PIPE_UNLIMITED_INSTANCES,
                 0, //Numb of output bytes
                 sizeof(Msg),  // Numb of input bytes
                 0, // Wait forever
                 NULL); // Don't know how to use security

ConnectNamedPipe (inputPipe,NULL);

    // Here is where the server dies
    ReadFile (inputPipe, &msg,sizeof(Msg),NULL,NULL); 

今Client.c:

struct Msg {
int numbers[20];
int length;
};


int main () {

HANDLE outputPipe, inputPipe;
Msg msg;

    // @misc: read data from keyboard, create msg   

outputPipe = CreateFile ("\\\\.\\pipe\\Client2Server",
            GENERIC_WRITE,
            FILE_SHARE_READ, // * comment after code
            NULL, // again, I know nothing about security attributes
            CREATE_ALWAYS, // either create or overwrite
            0,
            NULL);

// Here is where it dies
WriteFile (outputPipe, &msg, sizeof(Msg), NULL, NULL);

アクセス違反の書き込み場所0x00000000を取得します。理由はわかりません。

  • このプロセスは書き込みのみを行い、別のプロセス(サーバー)は読み取りのみを行うようにしたいと思います。大丈夫FILE_SHARE_READですか?

また、CreationDisposition / FlagsAndAttributes(の最後の2つのパラメーター)をいじる方法がわかりませんCreateFile。大丈夫ですか?

4

1 に答える 1

1

編集:実際の回答を追加し、他のトピックへの参照を追加し、自分で試しました

WriteFile()'s4番目のパラメーター(バイト数を格納する変数へのポインター)はnullであってはなりません。APIの説明に基づいて、このパラメーターは、5番目のパラメーターがnulllpOverlappedでない場合にのみNULLにすることができます。

こちらの同様のトピックを参照してください: 標準出力に書き込むときにWriteFileがクラッシュするのはなぜですか?


ReadFile()(return =0またはの場合は失敗FALSE)およびclient.c CreateFile()(returnsの場合は失敗)の戻り値をチェック/印刷しINVALID_HANDLE_VALUEて、成功するかどうかを確認できますか?

GetLastError()失敗した場合、特定のエラーを確認できるように、呼び出しの直後に返された値を出力できますか?

于 2012-11-25T15:27:31.953 に答える