programma di Mailslot semplice non funziona?
-
19-09-2019 - |
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);
}
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.