일단 이 타이니 빌컴 덕분에~생고생들 많이 한다고 생각한다.
예제 샘플을 보면 의도적인(?) 작은 함정들도 보이고.
연동가이드 1_1_5로 작업하는 분들이라면
생고생이다.
물론 이전것도 마찬가지고..
자 일단 fastGW 설치부터하자 에뮬레이터에서 라이브러리 설치하는 방법은 알리라 생각한다.
그냥 실행시키고 보관함으로가서 설치하면 된다. 이거 묻지마라. w 폴더에 넣어두면된다.
그럼 이제 가증스런 fastGW를 해보자.
예제를보면
void onDllLoading()
{
M_Byte buf[1024*50];
M_Int32 ret;
M_Int32 nDllID; //0103C0D8
M_Byte buf_Tmp_AppId[9] = {'0','1','0','3','C','0','D','8',0x00};
//MC_knlGetProgramName() 으로 app id 8 byte 가져와야 함
#ifdef EMULATOR
ret = MC_knlGetExecNames("relay_Emul_Clet", NULL, NULL, buf, sizeof(buf));
#else
ret = MC_knlGetExecNames("01039ADD", NULL, NULL, buf, sizeof(buf));
#endif
if(ret < 0)
msg("LIBRARY LOAD FAIL:%d \n",ret);
else
{
ret = MC_knlLoad(buf, 0);
msg("knlLoad:%d \n",ret);
if(ret >= 0)
{
msg("dll 로딩 \n");
nDllID = ret;
libRelay = MC_knlGetDLLInterface("FastRelay", -1, -1, NULL,NULL); // DLL 인터페이스명
// 1.Application ID 구하기
#ifdef EMULATOR
libRelay->FastRelaySetAppID((M_Byte*)&buf_Tmp_AppId,strlen(buf_Tmp_AppId));
#else
memset(buf,0x00,sizeof(buf));
ret = MC_knlGetProgramName(buf,sizeof(buf));
if(ret != M_E_SHORTBUF)
libRelay->FastRelaySetAppID(buf,strlen(buf));
#endif
}
}
memset(&ioData,0x00,sizeof(stIOData));
ioData.totalsize=512;
}
dll로딩 함수가 있는데. 아시다시피 문서랑 현재 버전이랑 매칭이 안된다. 그거 잘 바꾸어주고
꼭 어플아이디 넣도록하자 안그럼 게이트웨이에 접속할 때 우드블럭만 뜰거다.
M_Byte buf_Tmp_AppId[9] = {'0','1','0','3','C','0','D','8',0x00}; 요거다.
그럼 다음은?
void onConnect()
{
M_Int32 ret = 0;
M_Int32 ip= MC_utilInetAddrInt(S_IP);
M_Int16 port = _HTONS(atoi(S_PORT));
if(!m_bNetConnect)
ret = MC_netConnect((NETCONNECTCB)ConnectCB, NULL);
else
ret = libRelay->FastRelayTCPConnect(ip,port,FALSE);
}
연결해야지 이건 별 문제 없다. 테스트할 땐 꼭 FALSE로 하자.
이제 데이터 보낼 때. 안타까운일인지 고의적인지 소스상에서
ioData.remainsize 사이즈 설정 부가 없다. 당연히 알 수 있는 내용인데 설마...
그럴리가 하면서 대충보다 하루를 잡아먹었다. 갓뎀.
M_Int32 Send_Data()
{
M_Int32 ret=0;
sockFD = libRelay->FastGetSocket(m_isUDP); // fastGW에서 소켓 가지고 오자. 그냥 소켓 생성해서 쓸 수 있을지는 몰겠다. 매번 여기다 해주는 게 속편할거다.
// libRelay->FastRelayTCPChk() 를 이용해서 보낼 수 있는지 알아보는 것도 좋다. 무시해도 좋고
ioData.remainsize=10; // 보낼 패킷 사이즈 넣어주라.
while (ioData.offset < 512)
{
if(m_isUDP)
ret = libRelay->FastRelayUDPSend(sockFD, ioData.pBuf +ioData.offset, ioData.remainsize);
else
ret = libRelay->FastRelayTCPWrite(sockFD, ioData.pBuf +ioData.offset, ioData.remainsize);
msg("Send_Data:%d %d/%d \n", ret,m_isUDP,ioData.remainsize);
if(ret < 0)
{
msg("송신 에러:%d \n",ret);
if(ret == M_E_WOULDBLOCK)
{
msg("Write - [M_E_WOULDBLOCK] remainsize(%d)\n", ioData.remainsize);
ret = MC_netSetWriteCB(sockFD,(NETSOCKWRITECB)SocketWriteCB, NULL);
if(ret < 0) return M_E_ERROR;
return 0;
}
return M_E_ERROR;
}
ioData.offset += ret;
ioData.remainsize -= ret;
if(ioData.remainsize == 0)
{
break;
}
}
ioData.offset=0;
msg("전송 완료:%d \n",ioData.offset);
return ret;
}
그럼 문제 에뮬에서 테스트가 안되는가? 안된다. 에뮬에서는 그냥 GW 안거친다. 그래도 CP서버는 들어가니까 거기서 쿵짝해도 좋다. 그럼 폰은? 폰 테스트시 KTF측 게이트웨이에 접속한 뒤 CP서버로 들가기 때문에 CP서버로 들어가기 위해서는 보내질 패킷이 0보다 커야 보내진다.
한마디로 1바이트라도 패킷이 없으면 CP서버로 연결은 안된다.
초기 게이트웨이에 접속하면 반드시 바로 데이터를 포함하여 날려주자 안그럼 끊어진다.
보낼 패킷 크기 꼭 설정하고..
부실한 메뉴얼로 인하여 (사실 다 아는 내용이라 간과했겠지만 그래도 돌아가는 예제를 줘야 할맛이 나지..닝기리~궁시렁~..)
ps. send할 때 -701 떨어지면 유저데이터 즉 보낼 패킷이 0이란 거다. -701은 진행중 에러
ps2. libRelay->FastRelayTCPChk() 이 함수는 초기 접속시 WING의 내부 처리가 끝났는지 알려준다. true가 반환되기 전까지는 기다리면 된다.
www.gamehon.comwww.gamemotor.com
'Game Programming' 카테고리의 다른 글
Orient Saga 클베 시작했다. (0) | 2008.04.08 |
---|---|
모바일 유료 아이템 서버 풀그림 (0) | 2008.04.08 |
한창 프리랜서로 살 때 (0) | 2007.11.21 |
황금열쇠의 원형 (0) | 2007.11.21 |
서버 프로토콜은 어떻게 해야 하는가? (0) | 2007.11.04 |