programme simple Mailslot ne fonctionne pas?
-
19-09-2019 - |
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);
}
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.