Pregunta

Usando los ejemplos de cliente y servidor que se encuentran aquí: http://www.winsocketdotnetworkprogramming.com/ winsock2programming / winsock2advancedmailslot14.html Compilar con VS2008, que ejecuta el servidor y luego "MySlot cliente" me pone "WriteFail se produjo el error 53." ¿Alguien tiene alguna idea? Los enlaces a otros ejemplos Mailslot también son bienvenidos, gracias.

Servidor:

    // 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);
}
¿Fue útil?

Solución

error 53 es ERROR_BAD_NETPATH, "La ruta de red no se encontró". Es evidente que está utilizando el nombre de servidor incorrecto para la ranura de correo. Utilice \\.\mailslot\blah si el servidor se ejecuta en la misma máquina que su cliente. Y no se olvide de escapar de la barra invertida en una cadena:. "\\\\.\\mailslot\\blah"

Otros consejos

He copiado el código exactamente como se publican en dos archivos, los compilaron con VS2008 y corrieron a la perfección. Si el programa cliente se compila como client.exe, a continuación, escriba el siguiente comando:

client .

o

client <computername>

, donde nombre del equipo es el nombre de la PC sin el dominio. Puede llamar a la API GetComputerName para recuperar el nombre.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top