Domanda

Usare gli esempi di client e server si trovano qui: http://www.winsocketdotnetworkprogramming.com/ winsock2programming / winsock2advancedmailslot14.html loro compilazione con VS2008, che esegue il server e quindi "client Myslot" Continuo a ricevere "WriteFail riuscita con errore 53." Qualcuno ha qualche idea? Link ad altri esempi mailslot sono i benvenuti, grazie.

Server:

    // 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);
    }
}

Cliente:

// 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);
}
È stato utile?

Soluzione

errore 53 è ERROR_BAD_NETPATH, "non è stato trovato il percorso di rete". Chiaramente si utilizza il nome del server sbagliato per la slot di caricamento. Utilizzare \\.\mailslot\blah se il server viene eseguito sulla stessa macchina come client. E non dimenticate di sfuggire al backslash in una stringa:. "\\\\.\\mailslot\\blah"

Altri suggerimenti

Ho copiato il codice esattamente come pubblicato in due file, compilati con VS2008 e correvano perfettamente. Se il programma client è compilato come client.exe, quindi digitare il seguente comando:

client .

o

client <computername>

dove nome computer è il nome del PC senza il dominio. È possibile chiamare l'API GetComputerName per recuperare il nome.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top