2010-03-14 18 views
0

En utilisant les exemples client et serveur trouvé ici: http://www.winsocketdotnetworkprogramming.com/winsock2programming/winsock2advancedmailslot14.html les VS2008 Compiler avec, en cours d'exécution du serveur, puis « client MySlot » Je continue à obtenir « WRITEFAIL échoué avec l'erreur 53. » Quelqu'un a des idées? Des liens vers d'autres exemples de Mailslot sont également les bienvenus, merci.Le programme Simple Mailslot ne fonctionne pas?

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); 
} 

Répondre

1

Erreur 53 est ERROR_BAD_NETPATH, "Le chemin réseau n'a pas été trouvé". Vous utilisez clairement le mauvais nom de serveur pour le mailslot. Utilisez \\.\mailslot\blah si le serveur s'exécute sur la même machine que votre client. Et n'oubliez pas d'échapper la barre oblique inverse dans une chaîne: "\\\\.\\mailslot\\blah".

+0

Où avez-vous trouvé l'explication de l'erreur? L'utilisation de \\. \ Mailslot \ myslot me donne 161 maintenant. – Shawn

+0

Toute combinaison de guillemets/barres obliques inverses renvoie toujours l'erreur 161. – Shawn

+0

Ah, nouveau code d'erreur. 161 = ERROR_BAD_PATHNAME. Je ne peux pas voir ce que tu fais d'ici. –

1

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.