programa de procesador de mensajes simples que no trabaja?
-
19-09-2019 - |
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);
}
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.