2012-12-08 1 views
1

420 바이트보다 큰 데이터 덩어리를 보낼 수 없습니다. 예를 들어 421 bytes을 보내려고하면 ReadFile으로 읽을 수 없습니다. GetMailslotInfo(handleRead, 0, &msgSize, 0, 0);으로 maislot 정보를 확인하면 msgSize은 항상 -1입니다.메일 슬롯을 통해 wchar_t 배열을 보낼 수 없습니다.

그래서 나를 위해 작동하지 않습니다 :

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

사람이 행동에 대한 이유를 알고 있나요? 이것은 정상적인 행동입니까?

+1

내가 작업중인 클라이언트와 서버가 있습니다. 다음은 클라이언트 코드입니다. http://pastebin.com/iq76EvAN 여기 서버 코드가 있습니다. http://pastebin.com/fy5nCd1t –

답변

3

MSDN's documentation on mailslots 별 :

메일 슬롯 메시지의 데이터 형식은 다양 할 수 있지만 컴퓨터간에 보낼 때 424 바이트를 초과 할 수 없습니다.

컴퓨터간에 424 바이트보다 큰 메시지를 보내려면 대신 named pipes 또는 Windows Sockets을 사용하십시오.

+0

참고 : 이는 컴퓨터간에 * 전송하는 경우에만 해당됩니다. 클라이언트와 서버가 같은 컴퓨터에있는 경우에는 적용되지 않는 것 같습니다 (그러나 OP의 증상을 고려할 때 이것이 문제의 원인이라고 추측 할 수 있습니다). –

0

내가 잘못했는지 잘 모르겠지만 메일 슬롯은 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 
+0

@AdamMaras : 작동 여부를 표시하도록 출력을 추가했습니다. 확실히이 일을한다고 주장하는 것은 좋은 생각입니다). FWIW, 이것은 Windows 7에서 테스트되었습니다. –

+1

내 코멘트를 삭제했습니다; 문서를 읽은 후 424 바이트 제한이 컴퓨터간에 메일 슬롯에 적용된다는 것을 알게되었습니다. –

+0

@AdamMaras : 예 - 언급되어 있으며 내 의견에 강조되었습니다. –

관련 문제