• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

서버와 클라이언트의 소켓 관련 질문

21.05.17 23:00 작성 조회수 95

0

제가 이해한 것이 맞다면, 서버와 클라이언트는 미리 주어진 주소(예제에서는 자기 컴퓨터의 로컬 주소)가 담긴 endpoint로 초기화된 소켓을 통해 소통을 하고 있는데요,

음식점으로 비유를 하자면 손님도 식당의 전화번호를 알고 있는데, 식당도 이미 손님의 전화번호를 알고 있는 상태인 것 같습니다.

그런데 보통 이런 경우보다는, 손님이 식당에 전화를 걸면 그때서야 식당이 손님의 전화번호를 알고 다시 응답 전화를 해주거나 할텐데요.

즉 로컬 환경에서 정해진 주소가 아니라, 실제로 클라이언트가 서버로 요청을 보내고 서버는 정확히 "요청을 보낸 서버"의 endpoint로 다시 메시지를 보내기 위해서는 Socket 클래스의 생성자 중에서

endpoint없이 SocketType과 ProtocolType으로만 초기화해주는 버전으로 생성하고, Accept로 들어온 클라이언트의 소켓에서 주소를 얻어와서 그 주소로 응답해주는 식으로 구현해야 하는지 궁금합니다.

답변 1

답변을 작성해보세요.

2

제가 이해한 것이 맞다면, 서버와 클라이언트는 미리 주어진 주소(예제에서는 자기 컴퓨터의 로컬 주소)가 담긴 endpoint로 초기화된 소켓을 통해 소통을 하고 있는데요,

->
지금은 둘다 로컬 주소로 서버를 열고 클라를 붙여서 조금 헷갈릴 수도 있는데,

클라 쪽에서는 연결할 상대 주소를 설정하고
서버 쪽에서는 자신의 주소를 설정하는겁니다. (클라 주소가 아님)

음식점으로 비유를 하자면 손님도 식당의 전화번호를 알고 있는데, 식당도 이미 손님의 전화번호를 알고 있는 상태인 것 같습니다.
-> 그렇지 않습니다. 서버는 상대가 누군지 미리 알 수 없고
MMO로 치면 어떤 클라가 어디에서 접속할지는 당연히 알지 못하겠죠.
우리가 직접 설정하지 않았지만,
클라에서 connect할 때 자신의 ip와
자동으로 할당된 임의의 port를 같이 서버에 보내줍니다.
따라서 서버에서 TCP 연결이 맺어지는 순간에
서버에서 클라의 ip/port를 알게 되는 것입니다.

leomessi님의 프로필

leomessi

질문자

2021.05.17

아~ 서버는 자기 자신으로 주소를 설정하는거였군요..

그러고보니 설명해주실 때 문지기는 식당 주소를 갖고 있다고 말씀하셨던 게 기억이 나네요

그럼 클라이언트와의 소통은 AcceptSocket 프로퍼티로 이루어지고, 여기에 클라의 정보들이 다 들어있다는 말씀이신가요?

네 그렇습니다!

leomessi님의 프로필

leomessi

질문자

2021.05.17

빠른 답변 감사드립니다!!