이게 공백인가요??
글쓴이: BrownBear / 작성시간: 토, 2014/05/31 - 1:59오후
CreateMailSlot을통해서 자료를 주고받는걸 시연했는데 이상하게뜹니다.
아래는 소스코드입니다.
Client.cpp
#include <Windows.h> #include <stdio.h> int main(int argc, char **argv) { TCHAR MAILSLOT_PATH[128] = "\\\\.\\mailslot\\"; TCHAR MAILSLOT_NAME[64]; TCHAR BUFFER[512]; DWORD WriteSize; HANDLE MAILSLOT_HANDLE = INVALID_HANDLE_VALUE; printf("Demonstration of MailSlot Client\n"); printf("MailSlot Name:"); scanf_s("%s", &MAILSLOT_NAME, 64); strcat(MAILSLOT_PATH, MAILSLOT_NAME); printf_s("MailSlot Path:%s\n", MAILSLOT_PATH, 128); MAILSLOT_HANDLE = CreateFile(MAILSLOT_PATH, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (MAILSLOT_HANDLE != INVALID_HANDLE_VALUE) { printf_s("Connected to MailSlot.", 48); Write: printf_s("Message:", 12); scanf_s("%s", &BUFFER, 512); if (!WriteFile(MAILSLOT_HANDLE, BUFFER, strlen(BUFFER) * sizeof(TCHAR), &WriteSize, NULL)) { printf_s("Can't Write to MailSlot.\n", 48); system("pause"); } goto Write; } else { printf_s("Can't Connected to MailSlot.\n", 32); printf_s("Error Code:%d", GetLastError()); } CloseHandle(MAILSLOT_HANDLE); system("pause"); return 0; }
클라이언트는 Server가 만든 MailSlot에 Connect해 자료를 전송합니다.
아래는 Server.cpp입니다.
#include <Windows.h> #include <stdio.h> int main(int argc, char **argv) { TCHAR MAILSLOT_PATH[128] = "\\\\.\\mailslot\\"; TCHAR MAILSLOT_NAME[64]; TCHAR BUFFER[512]; DWORD MessageSize = 0; DWORD MessageCount = 0; DWORD ReadSize = 0; HANDLE MAILSLOT_HANDLE = INVALID_HANDLE_VALUE; printf("Demonstration of MailSlot Server\n"); printf("MailSlot Name:"); scanf_s("%s", &MAILSLOT_NAME, 64); strcat(MAILSLOT_PATH, MAILSLOT_NAME); printf_s("MailSlot Path:%s\n", MAILSLOT_PATH, 128); MAILSLOT_HANDLE = CreateMailslot(MAILSLOT_PATH, 0, MAILSLOT_WAIT_FOREVER, NULL); if (MAILSLOT_HANDLE != INVALID_HANDLE_VALUE) { printf_s("Created MailSlot.\n", 32); while (TRUE) { if (GetMailslotInfo(MAILSLOT_HANDLE, NULL, &MessageSize, &MessageCount, NULL) != FALSE) { if (MessageSize > 0) { if (ReadFile(MAILSLOT_HANDLE, BUFFER, 512, &ReadSize, NULL) != FALSE) { printf_s("Receive:%s\n", BUFFER, 512); } } } else { printf_s("Can't Get MailSlot Information.", 96); break; } Sleep(10); } } else { printf_s("Can't Created MailSlot.\n", 32); printf_s("Error Code:%d", GetLastError()); } CloseHandle(MAILSLOT_HANDLE); system("pause"); return 0; }
여기서 부터 문제가생깁니다. Server에서 MailSlot을 생성하고 Client가 Connect해서 ABC라는걸 전송하는데 공백도아닌 이상한 문자가 뜹니다.
클라이언트에서 전송하는것에 문제가있는건가요 아니면 서버단에서 전송을받는것에서 문제가있는건가요??
File attachments:
첨부 | 파일 크기 |
---|---|
Capture.PNG | 15.74 KB |
Forums:
들여쓰기가 없어 읽기 불편... code 태그를
들여쓰기가 없어 읽기 불편... code 태그를 활용하셔요. 좋은 답변을 받을 가능성이 높아집니다.
세벌 https://sebuls.blogspot.kr/
Write에서 한글자 덜 갔네요
WriteFile(MAILSLOT_HANDLE, BUFFER, strlen(BUFFER) * sizeof(TCHAR), &WriteSize, NULL)
이렇게 하면 null terminator가 잘리게 됩니다. strlen은 null terminator를 카운트하지 않기 때문입니다.
(strlen() + 1 ) * sizeof ... 이렇게 하면 잘 갈 것 같네요
--
정말감사합니다.
정말 감사합니다. 원하는 문제가 바~로 해결되었습니다.
애초에 예제소스코드에 저렇게되있었는데 속으로 아니 왜 +1 을하지?? 하고 무시했던게 이런 결과를 가져올줄은 몰랐습니다.
그나저나, 나오기는 하는데
Hi, Help, Test이런건 제대로 전송이되는데 아래처럼
This is the Client라고 Server에 보내면 서버는 그것을 따로따로
This
is
the
Client
이렇게뜨네요.
원래 공백사이를 따로 인식해서 그런가요?
그건 scanf 때문이겠지요.
fgets등 라인을 통채로 넘길 수 있는 방식을 사용하시면 개선될겁니다.
무조건 적힌대로 따라하는 것보다는 훨씬 좋은 습관을 가지고 계시네요!
--
댓글 달기