【问题标题】:Can't send wchar_t array through mailslot无法通过邮槽发送 wchar_t 数组
【发布时间】:2012-12-08 17:30:49
【问题描述】:

我无法发送大于420 字节的数据块。例如,如果我尝试发送421 bytes,我无法使用ReadFile 阅读它。如果我使用GetMailslotInfo( handleRead, 0, &msgSize, 0, 0 ); 检查maislot 信息,那么msgSize 将永远是-1

所以这对我永远不起作用:

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

有人知道这种行为的原因吗?这是正常现象吗?

【问题讨论】:

标签: c winapi client-server mailslot


【解决方案1】:

MSDN's documentation on mailslots:

邮槽消息中的数据可以是任何形式,但在计算机之间发送时不能大于 424 字节。

要在计算机之间发送大于 424 字节的消息,请改用 named pipesWindows Sockets

【讨论】:

  • 注意:这是特定于在 计算机之间发送的。如果您的客户端和服务器在同一台计算机上,它似乎并不适用(但是,鉴于 OP 的症状,这可能是他的问题的根源)。
【解决方案2】:

我不确定您做错了什么,但邮槽绝对可以处理大于 421 字节的消息。这是一些测试代码(成功运行):

服务器:

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

客户:

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

结果:

E:\C\source>mailslot
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB
CDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCD
EFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF
GHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGH
IJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJ
KLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL
MNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN
OPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP
QRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQR
STUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRST
UVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUV
WXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWX
YZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHI
exit

【讨论】:

  • @AdamMaras:我添加了输出以显示它确实有效(尽管我当然不会声称这样做是个好主意)。 FWIW,这是在 Windows 7 中测试的。
  • 我删除了我的评论;阅读文档后,我意识到 424 字节的限制适用于跨计算机的邮槽(根据我的回答。)
  • @AdamMaras:是的——注意到(并在我的评论中强调)。
猜你喜欢
  • 1970-01-01
  • 2013-01-24
  • 2012-05-26
  • 1970-01-01
  • 2015-12-02
  • 2014-09-03
  • 2023-02-20
  • 2020-07-06
  • 1970-01-01
相关资源
最近更新 更多