Question

En utilisant les exemples client et serveur trouvés ici: http://www.winsocketdotnetworkprogramming.com/ winsock2programming / winsock2advancedmailslot14.html les Compiler avec VS2008, exécutant le serveur, puis « MySlot client » Je continue à obtenir « WRITEFAIL échoué avec l'erreur 53. » Quelqu'un at-il des idées? Liens vers d'autres exemples Mailslot sont également les bienvenus, merci.

Serveur:

    // 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:

// 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);
}
Était-ce utile?

La solution

Erreur 53 est ERROR_BAD_NETPATH, « Le chemin réseau n'a pas été trouvé ». Il est clair que vous utilisez le mauvais nom du serveur pour le mailslot. Utilisez \\.\mailslot\blah si le serveur fonctionne sur la même machine que votre client. Et ne pas oublier d'échapper à la barre oblique inverse dans une chaîne. "\\\\.\\mailslot\\blah"

Autres conseils

Je copié le code exactement comme affiché dans deux fichiers, compilés avec VS2008 et ils ont couru parfaitement. Si votre programme client est compilé sous la forme client.exe, puis tapez la commande suivante:

client .

ou

client <computername>

où le nom de l'ordinateur est le nom du PC sans le domaine. Vous pouvez appeler l'API GetComputerName pour récupérer le nom.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top