0

ここにあるクライアントとサーバーの例を使用します: http://www.winsocketdotnetworkprogramming.com/winsock2programming/winsock2advancedmailslot14.html VS2008 でそれらをコンパイルし、サーバーを実行してから「クライアント Myslot」を実行すると、「WriteFail がエラー 53 で失敗しました」というメッセージが表示され続けます。誰にもアイデアはありますか?他の Mailslot の例へのリンクも歓迎します。

サーバ:

    // Server sample
#include <windows.h>
#include <stdio.h>

void main(void)
{

    HANDLE Mailslot;
    char buffer[256];
    DWORD NumberOfBytesRead;

    // Create the mailslot

    if ((Mailslot = CreateMailslot("\\\\.\\Mailslot\\Myslot", 0, MAILSLOT_WAIT_FOREVER, NULL)) == INVALID_HANDLE_VALUE)
    {
        printf("Failed to create a mailslot %d\n", GetLastError());
        return;
    } 

    // Read data from the mailslot forever!

    while(ReadFile(Mailslot, buffer, 256, &NumberOfBytesRead, NULL) != 0)
    {
        printf("%.*s\n", NumberOfBytesRead, buffer);
    }
}

クライアント:

// Client sample

#include <windows.h>
#include <stdio.h>

void main(int argc, char *argv[])
{
    HANDLE Mailslot;
    DWORD BytesWritten;
    CHAR ServerName[256];

    // Accept a command line argument for the server to send a message to

    if (argc < 2)
    {
        printf("Usage: client <server name>\n");
        return;
    }

    sprintf(ServerName, "\\\\%s\\Mailslot\\Myslot", argv[1]);

    if ((Mailslot = CreateFile(ServerName, GENERIC_WRITE,

        FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)
    {
        printf("CreateFile failed with error %d\n", GetLastError());
        return;
    }

    if (WriteFile(Mailslot, "This is a test", 14, &BytesWritten, NULL) == 0)
    {
        printf("WriteFile failed with error %d\n", GetLastError());
        return;
    }

    printf("Wrote %d bytes\n", BytesWritten);
    CloseHandle(Mailslot);
}
4

2 に答える 2

1

エラー 53 は ERROR_BAD_NETPATH、「ネットワーク パスが見つかりませんでした」です。メールスロットに間違ったサーバー名を使用していることは明らかです。\\.\mailslot\blahサーバーがクライアントと同じマシンで実行されている場合に使用します。また、文字列内のバックスラッシュをエスケープすることを忘れないでください: "\\\\.\\mailslot\\blah".

于 2010-03-14T20:59:03.870 に答える
1

投稿されたとおりにコードを 2 つのファイルにコピーし、VS2008 でコンパイルしたところ、完全に実行されました。クライアント プログラムが client.exe としてコンパイルされている場合は、次のコマンドを入力します。

client .

また

client <computername>

ここで、コンピューター名は、ドメインを除いた PC の名前です。API GetComputerNameを呼び出して、名前を取得できます。

于 2010-03-24T14:30:38.653 に答える