Closed dethjuni-gm closed 9 years ago
해당 내용만 가지고는 어떤 부분을 궁금해 하시는 건지 알수가 없네요. P2P를 의미하는 건지, 또는 서버, 클라이언트 쪽을 의미하는 건지 내용을 구체적으로 기술해 주셨으면 좋겠습니다.
질문이 너무 간단했군요 ^^; P2P가 아닌 TCP 서버 클라이언트에서 peer의 정보를 얻어 오는 방법에 대한 문의 입니다. socket에서 getpeername()이나 CSocket에서 GetPeerName() 같은 방법이 있는지에 대한 문의였습니다.
서버에 접속한 클라이언트의 IP와 같은 정보를 얻어올려면 추가 구현을 해줘야 합니다. OnConnect 메소드가 호출될시 BasePacket에 해당 정보를 담아서 로직에 전달하면 되겠군요. 구현 검토하겠습니다.
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;
시간 나실 때 인터페이스를 갖춰서 반영 해 주시면 고맙겠습니다.
조언 감사드립니다. 참고해서 반영하겠습니다. 필요한 정보는 아이피와 포트뿐이지요?(raw한 구조체는 되도록 최종 어플리케이션에 노출시키지 않으려 합니다)
예 두 항목 맞습니다. 문자열과 정수로 얻을 수 있으면 좋겠습니다. 감사합니다.
패킷을 받을시 GetSessionDesc 메소드를 사용하시면 아이피 정보를 얻을 수 있습니다. 확인하시고 불편하다고 생각하시면 알려주세요.(써드파티가 업데이트되었으므로 새로 받아 주시기 바랍니다)
편하게 사용 할 수 있고 잘 동작합니다.
고맙습니다. ^^
peer의 정보를 얻어서 처리 할 일이 있는데 방법을 못 찾겠습니다. address와 port를 얻을 수 있는 방법이 있는지 궁금합니다.