c#서버로 보내는 c++클라의 코드 형식은 어떻게?

3권에서 새로 도입된 네트웍 및 멀티플레이어 프로그로그래밍 섹션을 위한 게시판입니다.

Moderator: 류광

Locked
비회원

c#서버로 보내는 c++클라의 코드 형식은 어떻게?

Post by 비회원 »

c++에서 보낸 것이 c#에서 바로 읽지 못하는 것이
아무래도 코드 형식 때문인 것 같습니다. 사실 이것도 정확하지 않음.

[c++] 클라
char g_msg[512];

WSAAsyncSelect(m_socket, hWnd, WM_SOCKET, FD_READ|FD_WRITE|FD_CLOSE);
send(m_socket, g_msg, 512, 0);

[c#] 서버

private StreamReader stmReader;

this.netStream = new NetworkStream(this.clientSocket);
this.stmReader = new StreamReader(this.netStream);

while(1)
{
string receiveString = stmReader.ReadLine(); // 클라이언트로 온 메시지를 받습니다.
LogTextBox.WriteMessage(receiveString); // 받은 메세지를 서버의 창에 로그로 남깁니다.
Thread.Sleep(300); // 잠시 쉽니다.
}


간략하게 보내고 받는 부분만 뽑아봤습니다.
c#이 c++의 메세지를 제대로 볼려고 하면어 어디를 어떻게 수정해야 되는지?
머리가 썩은 듯...OTL
비회원

코드만 봐서는 모르겠지만..

Post by 비회원 »

c#은 기본이 유니코드입니다.
아마 C++ 은 멀티코드바이트일듯한데..
그런 문제 아닐까요?
xevious7
Posts: 175
Joined: 2006-03-30 17:31
Contact:

Re: c#서버로 보내는 c++클라의 코드 형식은 어떻게?

Post by xevious7 »

비회원 wrote:c++에서 보낸 것이 c#에서 바로 읽지 못하는 것이
아무래도 코드 형식 때문인 것 같습니다. 사실 이것도 정확하지 않음.

[c++] 클라
char g_msg[512];

WSAAsyncSelect(m_socket, hWnd, WM_SOCKET, FD_READ|FD_WRITE|FD_CLOSE);
send(m_socket, g_msg, 512, 0);

[c#] 서버

private StreamReader stmReader;

this.netStream = new NetworkStream(this.clientSocket);
this.stmReader = new StreamReader(this.netStream);

while(1)
{
string receiveString = stmReader.ReadLine(); // 클라이언트로 온 메시지를 받습니다.
LogTextBox.WriteMessage(receiveString); // 받은 메세지를 서버의 창에 로그로 남깁니다.
Thread.Sleep(300); // 잠시 쉽니다.
}
안녕하세요.

C++코드의 문제라기보다는 C# 코드의 문제인것 같습니다.

stream Reader 클래스는 네트웍처리를 위해서 디자인 된것이 아니라
범용적인 스트림 처리를 위해서 디자인 된 함수입니다. 파일같은 경우는 읽는대는 무리가 없지만,
네트웍 스트림은 언제 끝날지 언제 시작할지 모르기 때문에 네트웍에서 쓰기시에는 writeln 으로
날려도 전혀 상관 없지만 , 읽기시에는 위에서 말한 이유 때문에
ReadLine으로 처리하게 되면 동작은 하지만 ,(네트웍스트림이 얼마나 있는지 부정확하기 때문에)
마치 파도타기처럼 불안정하게 리시브 하는 현상을 일으키게 됩니다.

좀더 베이직한 Stream 클래스를 사용하십시요. 즉 위의 소스에서 보면 netStream 을 그대로
사용하는 것이 좋습니다.

엔코딩처리나 바이트처리 이런것들을 해주셔야 합니다.
비회원

Re: c#서버로 보내는 c++클라의 코드 형식은 어떻게?

Post by 비회원 »

xevious7 wrote:
비회원 wrote:c++에서 보낸 것이 c#에서 바로 읽지 못하는 것이
아무래도 코드 형식 때문인 것 같습니다. 사실 이것도 정확하지 않음.

[c++] 클라
char g_msg[512];

WSAAsyncSelect(m_socket, hWnd, WM_SOCKET, FD_READ|FD_WRITE|FD_CLOSE);
send(m_socket, g_msg, 512, 0);

[c#] 서버

private StreamReader stmReader;

this.netStream = new NetworkStream(this.clientSocket);
this.stmReader = new StreamReader(this.netStream);

while(1)
{
string receiveString = stmReader.ReadLine(); // 클라이언트로 온 메시지를 받습니다.
LogTextBox.WriteMessage(receiveString); // 받은 메세지를 서버의 창에 로그로 남깁니다.
Thread.Sleep(300); // 잠시 쉽니다.
}
안녕하세요.

C++코드의 문제라기보다는 C# 코드의 문제인것 같습니다.

stream Reader 클래스는 네트웍처리를 위해서 디자인 된것이 아니라
범용적인 스트림 처리를 위해서 디자인 된 함수입니다. 파일같은 경우는 읽는대는 무리가 없지만,
네트웍 스트림은 언제 끝날지 언제 시작할지 모르기 때문에 네트웍에서 쓰기시에는 writeln 으로
날려도 전혀 상관 없지만 , 읽기시에는 위에서 말한 이유 때문에
ReadLine으로 처리하게 되면 동작은 하지만 ,(네트웍스트림이 얼마나 있는지 부정확하기 때문에)
마치 파도타기처럼 불안정하게 리시브 하는 현상을 일으키게 됩니다.

좀더 베이직한 Stream 클래스를 사용하십시요. 즉 위의 소스에서 보면 netStream 을 그대로
사용하는 것이 좋습니다.

엔코딩처리나 바이트처리 이런것들을 해주셔야 합니다.
네. 감사합니다.

특히 "파도타기처럼 불안정하게 리시브하는 현상"이라는 표현 그대로 발생하고 있습니다.

다시 도전해보고 결과(?)를 리포팅(^^;)하겠습니다.
비회원

;

Post by 비회원 »

제쪽이 c++ 이고 상대방이 c# 인상황에서 이런경우를 겪은적 있습니다.

다른게 아니라

readLine 이 진짜 Line을 읽습니다.
stdlib 에서의 fgets 의 꼴인데

결론은 메시지 끝에 개행문자 '\r\n' 를 넣으면 됩니다.
비회원

서로 주고 받는 인코딩 방식이 달라서 인 것 같네요

Post by 비회원 »

c++ 의 코드에서

char g_msg[512];

부분을 보면 multi-byte string을 보내시는 것이고 이것을 C# 쪽에서
같은 인코딩 방식으로 읽어 내려면 StreamReader 생성을 다음과 같이 하셔야 할 것 같습니다.

this.stmReader = new StreamReader(this.netStream, Encoding.Default);

위의 한분의 말씀대로 C#은 내부에서 문자는 unicode 로 처리됩니다. 따라서 외부(네트웍 통신, 파일)로
입출력을 할 필요가 있을 때 encoding 이 필요할 수 있습니다.
Locked