게임엔진관련/유니티 엔진

c++서버 유니티엔진과의 네트워크 통신 관련 .NET C# 소켓통신과 IOCP서버C++형태의 서버와의 호환성문제 ?

AlrepondTech 2020. 9. 20. 05:06
반응형

 

 

=================================

=================================

=================================

 

 

 

 

 

출처: http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=17&MAEULNo=8&no=148328&ref=148328

 

 

안녕하세요 ?

VS2010에서 x64비트 환경에서 Test하고 있습니다.

C++로 서버 TCP소켓구현을 해 가지고 잘 사용하다가

Unity3D의 .NET TCP소켓 통신으로 통신을 하는데

Client(Unity3d .Net C# TCP소켓)에서 통신을 잘 되는데,

서버쪽에서 받고 처리를 잘 합니다. 그 다음 결과값을 Client쪽에다가

보내줘야 하는데 이 부분에서 정상적인 처리가 안되네요.

서버쪽은 일반 C++ Client에서는 아무런 문제없이 잘 작동합니다.

Unity3D가 무슨 제약사항이라도 걸어놨나요 ?

보내는 것은 잘 되는데,

받아서 처리로 잘 되고,

그 다음 처리결과를 re send하는 것이 안되네요.

오류를 내면서 서버쪽에서 일방적으로 소켓을 끊어버리네요.

IP도 이상한 IP값으로 로그에 찍이고요.

서버쪽은 IOCP형태로 구성된 간단한 구조입니다.

어디가 문제일까요 ?

답변 주시면 감사하겠습니다

이상이 Vsiaul C++마을에 올린 질문입니다.

 

혹 Unity3D 소켓통신을 해보신 분들중에서,   간단하게

Unity3D의 최신버젼과 C#형태로 .NET으로 C++과 통신을 해 본 적이 있으신분 계신가요 ?

궁금합니다.   왜그런지....

제가 원하는것은 Byte단위로 모든 DATA가 오고가는 것입니다.

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

TCP/IP 통신은 표준입니다.

틀린거 없습니다.

 

그리고 IOCP는..  OS버퍼를 이용해서 통신하기때문에 생기는 문제.. 즉..  TCP/IP 데이터가 랜카드 버퍼(뭐 요즘은 메인램을 공유하죠.. 서버카드가 아닌 이상) 에 수신되면.. 그걸 OS 가 자기 버퍼에 옮기고.. 그걸 다시 App 가 자기 버퍼로 옮겨와서 사용하는데,(보낼때는 반대로.. App 에서 자기 버퍼에 쓰고.. 그버퍼를 OS 버퍼로 옮기고.. OS는 랜카드 버퍼로 옮기고,, 랜카드 버퍼는 그걸 TCP/IP로 보내구) 의 과정을 단순화 시켜서..TCp/IP데이터가 OS버퍼를 거치지 않고 App 버퍼를 통하게 하는 것이죠.

 

IOCP는 TCP/IP 통신시  CPU 를 덜 쓰게 하는 효과가 생기는 것이죠..

 

통신 자체의 문제는 없습니다.

 

C#의 TCP/IP나 C++의 TCP/IP나 그 차이는 없습니다.

 

서버와 클라이언트 중에 누가 먼저 끊거나 바보를 만든다면

 

일단..

 

데이터를 주고 받는 과정을 체크 해 보세요

 

 C#의 경우 String을 byte[] 형태로 받아서 Encoding의 GetString()으로 변환해서 사용해야 하는 차이가 있을 뿐이구요

 

서버와 클라이언트 통신의 경우 Network Order를 HostOrder 로 마추는 과정도 필요합니다.

 

뭐 같은 CPU계열이면 상관없지만..  간혹 차이나는 경우에 문제가 생기죠( 정수를 주고 받으면 엄청난 차이가.. )

 

클라이언트 쪽에서 와이어샤크 같은 Network 패킷 캡쳐 툴로 해당 서버와의 통신되는 패킷을 떠서 원인파악을 해 보시는게 좋을거 같네요

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

IOCP는 과도한 쓰레드 컨텍스트 스위칭에 대한 성능감소 문제를 해결해 줍니다.

메모리와는 다릅니다.

.NET 3.5 부터 IOCP Socket를 지원하지만  Unity3D 는 잘 모르겠습니다.

 

IOCP는 소켓의 기능상 차이는 없습니다.  서버측에서 더 좋은 성능을 내기 위한 방법 입니다.

 

질문자님이 아마도 스트리밍 방식의 socket 핸들링에 대한 이해가 부족해서 발생한 오류일 가능성이 큽니다.

대다수 초심자분들이 실수 하시더군요.

 

C++ 는 패킷을 구조체에 넣어 한번에 읽거나 보내려고 흔히 쓰는데

일반적으로 .NET 에서는 그렇게 구현하지 않으시더군요. 패킷의 엘리먼트 단위로

socket에 push 하시는데 그렇게 보내면 받는측에서 데이터가 잘리거나 이어 붙을수 있습니다.

C++ 에서도 잘못 구현되었지만, .net 쪽에서도 잘못 구현된 사례 입니다.

 

게임에서는 NoDelay 옵션을 false로 두셔야 합니다.

이부분 확인하시고 패킷의 잘림에 대한 처리가 잘 되어 있는지 확인하세요.

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

=================================

=================================

=================================

 

 

 

출처: http://westwoodforever.blogspot.kr/2013/10/unity3d-ios-c.html

 

Unity3D iOS에서 C++ 서버와 통신중 한글이 ???로 나올 때

 

 

 

 위 그림과 같이 유니티3D iOS 버전에서 C++로 된 자체 서버와 통신하는데 있어서 한글만 ???로 깨지는 이슈가 발생했습니다. 안드로이드에서는 잘 되고 있다고 하네요. 일단 서버는 멀티바이트로 처리중인 상황이라고 하구요.

 

 

 

반응형

 

728x90

 

 

if (GUI.Button(new Rect(390, 250, 70, sizeHeight), "ATTACK") == true)

{

    Packet.S_CR_RELAY_PACKET packet = new Packet.S_CR_RELAY_PACKET();

    packet.targetUID = matchUserUID;

    byte[] chatbytes = Encoding.UTF8.GetBytes(chattingstring);

    packet.relayData = Convert.ToBase64String(chatbytes);

    Debug.Log(packet.relayData + "__" + chattingstring);

    //byte[] chatBytes=Encoding.Unicode.GetBytes(chat);

    //packet.relayData = Encoding.Unicode.GetString(chatBytes);

    ConnectToGameserver.GetInstance().SendPacket(packet);

}

 

 보낼 때 소스입니다. 처음에는 그냥 string를 Buffer.BlockCopy를 통해서 바로 보내다가 주석에 있는 것 처럼 Encoding.Unicode 로 해서 보내도 봤지만 위와 같이 보낼 스트링을 Encoding.UTF8.GetBytes 로 일단 byte[] 로 가져온 후 Convert.ToBase64String로 인코딩 처리 후 보내줘야하더군요.

 

void OnRecivePacket(Packet.S_RC_RELAY_PACKET packet)

{

    Debug.Log(" S_RC_RELAY_PACKET - SendUser:" + packet.senderUID.ToString() + 
    "payload=" + packet.relayData);

    byte[] chatBytes = Convert.FromBase64String(packet.relayData);

    packet.relayData = Encoding.UTF8.GetString(chatBytes);

    //Buffer.BlockCopy(packet.relayData.ToCharArray(), 0, chat, 0, packet.relayData.Length);

    //packet.relayData = Encoding.Unicode.GetString(chat);

    Debug.Log(" ====> " + packet.relayData);

    exampleText += packet.relayData;

}

 

 서버에서는 그대로 다른 클라이언트에 보낸 후 클라이언트 리시브를 처리하는 부분은 위와는 반대로 Convert.FromBase64String 로 디코딩을 한 후 Encoding.UTF8.GetString로 가져오면 한글을 제대로 처리할 수 있습니다.

 

 

 

 

 이건 혼자 채팅 테스트 해본 거구요.

 

 이건 실제로 서버를 통해 채팅을 해본 것입니다.

 Base64 인코딩 디코딩은 암호화 관련해서 쓰는 줄 알았는데 C#에서는 이런 이슈도 있네요.

작성자: 안상학 시간: 오후 2:11 

이메일로 전송BlogThis!Twitter에서 공유Facebook에서 공유Pinterest에 공유

 

라벨: Unity3D

 

 

=================================

=================================

=================================

 

 

 

출처: http://devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=12091

 

유니티 3d를 이용하여 간단한 온라인 pc게임을 만드려고 하는데요 

유니티를 클라이언트로 하여 visual2010으로 서버를 구현하여 통신을 하려고 하는데 

어떤식으로 하여야 하는지 지금 검색하고있는데 좀 막막하네요 서버는 iocp를 이용하여 구현하려고 

합니다. 유니티 서버 클라이언트 좋은정보 있으면 알려주세요

 

 

 

 Junios  2012.01.02 15:18:03

IOCP서버로 통신을 하려면 C#으로 소켓 프로그래밍 하시면 됩니다.

0

 

 

 bjh1371  2012.01.03 11:40:42

c++로 서버를 구현할려고 하는데요 c++서버와 c#인 유니티가 제대로 통신을 할수 있을까요? 
제가 찾아보기로눈 C++ dll을 사용하기 위해서는 Pro버전을 이용해야 한다는 말도 있고 그런데요 무료버전으로 C++ 서버로 유니티와 통신하여 로비서버및 게임서버를 제대로 구현할수 있을지 정말 걱정입니다.

0

 

 

 Junios  2012.01.03 15:45:41

서버는 어떤 언어로 하셔도 상관 없습니다. 클라이언트에서 C#으로 소켓 만들어서 하면 잘 됩니다. 지금 작업하는것도 그렇고 상용엔진 소스도 그렇고 유니티 자체 네트웍도 Raknet이라고는 C++ 소스로 돌아갑니다.

0

 

 

 bjh1371  2012.01.03 16:24:43

혹시 정말 죄송한데 약간의 작업예제라든지 조금의 참고할만 한 자료같은게 있으신지요 ㅠㅠ 
자료를 많이 찾아보고있긴하나 역시 온라인게임으로 하려니 좀 막막한게 사실입니다. 제가 구글에서 많은 검색을 해보니 DLL을 추가하여야 된다는 말도 많이 보았는데요..조금의 참고할만한 자료정도만 보내주시면 안될까요 ㅠㅠ

 

 

 

=================================

=================================

=================================

 

 

반응형