Pergunta

Usando os exemplos de cliente e servidor encontrado aqui: http://www.winsocketdotnetworkprogramming.com/ winsock2programming / winsock2advancedmailslot14.html compilá-los com VS2008, executando o servidor e, em seguida, "Myslot cliente" eu continuo recebendo "WriteFail falhou com o erro 53." Alguém tem alguma ideia? Links para outros exemplos processador de mensagens também são bem vindos, obrigado.

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);
}
Foi útil?

Solução

Erro 53 é ERROR_BAD_NETPATH, "O caminho de rede não foi encontrado". É claro que você está usando o nome do servidor errado para o processador de mensagens. Use \\.\mailslot\blah se o servidor é executado na mesma máquina que o seu cliente. E não se esqueça de escapar a barra invertida em uma string:. "\\\\.\\mailslot\\blah"

Outras dicas

I copiado o código exatamente como postou em dois arquivos, compilado-los com VS2008 e eles correram perfeitamente. Se o seu programa cliente é compilado como client.exe, em seguida, digite o seguinte comando:

client .

ou

client <computername>

onde nome do computador é o nome do PC sem o domínio. Você pode chamar a API GetComputerName para recuperar o nome.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top