Question

I can't send chunks of data bigger than 420 bytes. For example if i try to send 421 bytes, i can't read it with ReadFile. If I check the maislot info with GetMailslotInfo( handleRead, 0, &msgSize, 0, 0 ); then msgSize will always be -1.

So this will never work for me:

err = WriteFile( handleWrite, wcharArrayToSend, 421, &numBytesWritten, NULL );

Does anyone know a reason for this behavior? Is this a normal behavior?

Was it helpful?

Solution

Per MSDN's documentation on mailslots:

The data in a mailslot message can be in any form, but cannot be larger than 424 bytes when sent between computers.

To send messages that are larger than 424 bytes between computers, use named pipes or Windows Sockets instead.

OTHER TIPS

I'm not sure what you've done wrong, but mailslots can definitely handle messages greater than 421 bytes. Here's some test code (that runs successfully):

Server:

#include <windows.h>
#include <stdio.h>

int main() {    
    HANDLE mailslot = CreateMailslot("\\\\.\\mailslot\\myslot", 
        0, 
        MAILSLOT_WAIT_FOREVER, 
        NULL);
    if (mailslot == INVALID_HANDLE_VALUE) {
        fprintf(stderr, "Unable to create mailslot.");
        return 1;
    }

    char buffer[2048];
    OVERLAPPED ovlp = {0};

    ovlp.hEvent = CreateEvent(NULL, false, false, NULL);   
    if (ovlp.hEvent == NULL) {
        fprintf(stderr, "Unable to create Event.");
        return 2;
    }

    DWORD read;

    do { 
        ReadFile(mailslot, buffer, sizeof(buffer), &read, &ovlp);
        buffer[read] = 0;
        WaitForSingleObject(ovlp.hEvent, INFINITE);
        printf("%s\n", buffer);
    } while (strcmp(buffer, "exit"));    
    return 0;
}

Client:

#include <windows.h>
#include <stdio.h>

int main() {    
    HANDLE mailslot = CreateFile("\\\\.\\mailslot\\myslot", 
        GENERIC_WRITE, 
        FILE_SHARE_READ | FILE_SHARE_WRITE, 
        NULL, 
        OPEN_ALWAYS, 
        0, 
        NULL);

    if (INVALID_HANDLE_VALUE == mailslot) {
        fprintf(stderr, "Unable to open mailslot.\n");
        return 1;
    }
    char buffer[2048];
    DWORD written;

    for (int i=0; i<1024; i++)
        buffer[i] = 'A' + (i%26);
    buffer[1023] = '\0';
    size_t len = strlen(buffer);

    WriteFile(mailslot, buffer, len, &written, NULL);    
    WriteFile(mailslot, "exit", 4, &written, NULL);
    return 0;
}

Result:

E:\C\source>mailslot
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB
CDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCD
EFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF
GHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGH
IJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJ
KLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL
MNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN
OPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP
QRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQR
STUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRST
UVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUV
WXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWX
YZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHI
exit
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top