강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

chobo님의 프로필 이미지
chobo

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

RemoteEndPoint , UserToken 질문있습니다.

작성

·

501

0

[Session #3 강의]

public void Init(IPEndPoint endPoint, Func<Session> sessionFactory) 

{

SocketAsyncEventArgs args = new SocketAsyncEventArgs();

       args.Completed += new EventHandler<SocketAsyncEventArgs>(OnAcceptCompleted);

       RegisterAccept(args);

}

void RegisterAccept(SocketAsyncEventArgs args)

{

args.AcceptSocket = null;

}

[Connector 강의]

public void Connect(IPEndPoint endPoint, Func<Session> sessionFactory)

{  

        Socket socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

        args.Completed += OnConnectCompleted;

args.RemoteEndPoint = endPoint; // ★★★

args.UserToken = socket; // ★★★

RegisterConnect(args);

}

void RegisterConnect(SocketAsyncEventArgs args)

{

Socket socket = args.UserToken as Socket;

if (socket == null)

        return;

}

[질문 1] 

① args.Completed += new EventHandler<SocketAsyncEventArgs>(OnAcceptCompleted);

② args.Completed += OnConnectCompleted;

이벤트 핸들러를 연결하는 ① 번과 ②번 방식에  차이점이 있나요?  왜 ②번에서는 

new EventHandler<SocketAsyncEventArgs> 제외하셨는지 궁금합니다.

[질문 2]

MSDN을 참고해서 

RemoteEndPoint  : 데이터를 보낼 endPoint를 지정할 수 있다.

UserToken : 연결된 사용자를 가져온다. 는 것을 알았습니다.

그럼 아래 두 코드는 다음과 같이 해석하면 되나요?

args.RemoteEndPoint = endPoint; 

args.UserToken = socket; 

일단 endPoint(ip주소와 포트번호)를 지정 후,

socket을 대입하는 것은  args의 AddressFamily,  SocketType, ProtocolType을 지정해준다고 생각하면 될까요?

답변 1

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

1)
event 연결하는 2가지 문법이 있는데, 큰 차이 없습니다
https://stackoverflow.com/questions/2749868/new-eventhandlermethod-vs-method

2) 
UserToken은 꼭 사용해야 하는 애는 아니고
그냥 넘겨주고 싶은 데이터가 있으면 저장하는 용도라고 보시면 됩니다.
args에 뭔가를 지정해주는 개념은 아니고
이미 만들어준 Socket을 잠시 저장했다가 나중에 다시 꺼내 사용하는 쪽에 가깝습니다.

가령 UserToken을 사용하지 않고,
RegisterConnect에 2번째 인자로 socket을 받아서 진행해도 똑같이 동작합니다.

chobo님의 프로필 이미지
chobo

작성한 질문수

질문하기