이게 공백인가요??

BrownBear의 이미지

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: 
첨부파일 크기
Image icon Capture.PNG15.74 KB
세벌의 이미지

들여쓰기가 없어 읽기 불편... code 태그를 활용하셔요. 좋은 답변을 받을 가능성이 높아집니다.

mirheekl의 이미지

WriteFile(MAILSLOT_HANDLE, BUFFER, strlen(BUFFER) * sizeof(TCHAR), &WriteSize, NULL)

이렇게 하면 null terminator가 잘리게 됩니다. strlen은 null terminator를 카운트하지 않기 때문입니다.
(strlen() + 1 ) * sizeof ... 이렇게 하면 잘 갈 것 같네요

--

BrownBear의 이미지

정말 감사합니다. 원하는 문제가 바~로 해결되었습니다.

애초에 예제소스코드에 저렇게되있었는데 속으로 아니 왜 +1 을하지?? 하고 무시했던게 이런 결과를 가져올줄은 몰랐습니다.

그나저나, 나오기는 하는데

Hi, Help, Test이런건 제대로 전송이되는데 아래처럼

This is the Client라고 Server에 보내면 서버는 그것을 따로따로

This
is
the
Client
이렇게뜨네요.

원래 공백사이를 따로 인식해서 그런가요?

mirheekl의 이미지

fgets등 라인을 통채로 넘길 수 있는 방식을 사용하시면 개선될겁니다.

무조건 적힌대로 따라하는 것보다는 훨씬 좋은 습관을 가지고 계시네요!

--

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.