=================================
=================================
=================================
출처: 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++로 된 자체 서버와 통신하는데 있어서 한글만 ???로 깨지는 이슈가 발생했습니다. 안드로이드에서는 잘 되고 있다고 하네요. 일단 서버는 멀티바이트로 처리중인 상황이라고 하구요.
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#에서는 이런 이슈도 있네요.
이메일로 전송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#으로 소켓 프로그래밍 하시면 됩니다.
bjh1371 2012.01.03 11:40:42
c++로 서버를 구현할려고 하는데요 c++서버와 c#인 유니티가 제대로 통신을 할수 있을까요?
제가 찾아보기로눈 C++ dll을 사용하기 위해서는 Pro버전을 이용해야 한다는 말도 있고 그런데요 무료버전으로 C++ 서버로 유니티와 통신하여 로비서버및 게임서버를 제대로 구현할수 있을지 정말 걱정입니다.
Junios 2012.01.03 15:45:41
서버는 어떤 언어로 하셔도 상관 없습니다. 클라이언트에서 C#으로 소켓 만들어서 하면 잘 됩니다. 지금 작업하는것도 그렇고 상용엔진 소스도 그렇고 유니티 자체 네트웍도 Raknet이라고는 C++ 소스로 돌아갑니다.
bjh1371 2012.01.03 16:24:43
혹시 정말 죄송한데 약간의 작업예제라든지 조금의 참고할만 한 자료같은게 있으신지요 ㅠㅠ
자료를 많이 찾아보고있긴하나 역시 온라인게임으로 하려니 좀 막막한게 사실입니다. 제가 구글에서 많은 검색을 해보니 DLL을 추가하여야 된다는 말도 많이 보았는데요..조금의 참고할만한 자료정도만 보내주시면 안될까요 ㅠㅠ
=================================
=================================
=================================
'게임엔진관련 > 유니티 엔진' 카테고리의 다른 글
[Unity] 유니티 인터넷 서비스 연결확인 관련 (0) | 2021.01.12 |
---|---|
[Unity] 유니티 Web빌드 유니티 타이니 Unity Tiny 설치 관련 (0) | 2020.11.10 |
[Unity] Visual Studio Tools for Unity 사용, 스크립트열기, 코드디버깅 등등 관련 (0) | 2020.09.19 |
[Unity] 유니티 캔버스 스케일러(Canvas Scaler) 컴포넌트, 여러크기의 해상도 대응 관련 (0) | 2020.09.19 |
[Unity] 유니티 웹개발 Tiny 모드관련 (0) | 2020.09.14 |