pdpdds / CGSF

Online Game Server Platform
135 stars 68 forks source link

Peer의 address 및 port를 알아내는 getpeername 지원 #18

Closed dethjuni-gm closed 9 years ago

dethjuni-gm commented 9 years ago

peer의 정보를 얻어서 처리 할 일이 있는데 방법을 못 찾겠습니다. address와 port를 얻을 수 있는 방법이 있는지 궁금합니다.

pdpdds commented 9 years ago

해당 내용만 가지고는 어떤 부분을 궁금해 하시는 건지 알수가 없네요. P2P를 의미하는 건지, 또는 서버, 클라이언트 쪽을 의미하는 건지 내용을 구체적으로 기술해 주셨으면 좋겠습니다.

dethjuni-gm commented 9 years ago

질문이 너무 간단했군요 ^^; P2P가 아닌 TCP 서버 클라이언트에서 peer의 정보를 얻어 오는 방법에 대한 문의 입니다. socket에서 getpeername()이나 CSocket에서 GetPeerName() 같은 방법이 있는지에 대한 문의였습니다.

pdpdds commented 9 years ago

서버에 접속한 클라이언트의 IP와 같은 정보를 얻어올려면 추가 구현을 해줘야 합니다. OnConnect 메소드가 호출될시 BasePacket에 해당 정보를 담아서 로직에 전달하면 되겠군요. 구현 검토하겠습니다.

dethjuni-gm commented 9 years ago

ACE에 int ACE_OS::getpeername(ACE_HANDLE handle, struct sockaddr * addr, int * addrlen) 이 있습니다. 이 것을 SFEngine에 추가 해서 어디서든지 Serial만 전달하면 값을 얻어 올 수 있게 하면 범용적으로 사용 할 수 있을 것 같습니다.

ProactorServiceManager.h 에 아래와 같이 코드를 추가하고 테스트 해 보았습니다.

SFLockHelper lock(&m_lock);

T* pProactorService = Get(serial);

if (pProactorService != NULL) { sockaddr_in addr; int addrLen = sizeof(addr);

ACE_OS::getpeername(pProactorService->handle(), (sockaddr *) &addr, &addrLen);
printf("Peer address: %s, port: %d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
return true;

}

return false;

시간 나실 때 인터페이스를 갖춰서 반영 해 주시면 고맙겠습니다.

pdpdds commented 9 years ago

조언 감사드립니다. 참고해서 반영하겠습니다. 필요한 정보는 아이피와 포트뿐이지요?(raw한 구조체는 되도록 최종 어플리케이션에 노출시키지 않으려 합니다)

dethjuni-gm commented 9 years ago

예 두 항목 맞습니다. 문자열과 정수로 얻을 수 있으면 좋겠습니다. 감사합니다.

pdpdds commented 9 years ago

패킷을 받을시 GetSessionDesc 메소드를 사용하시면 아이피 정보를 얻을 수 있습니다. 확인하시고 불편하다고 생각하시면 알려주세요.(써드파티가 업데이트되었으므로 새로 받아 주시기 바랍니다)

dethjuni-gm commented 9 years ago

편하게 사용 할 수 있고 잘 동작합니다.

고맙습니다. ^^