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

WolLu님의 프로필 이미지
WolLu

작성한 질문수

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

Session #3

Receive 버퍼에 대한 질문

작성

·

335

1

저희가 Send를 할땐 Socket.Send()라던가 Socket.SendAsync() 같이 메서드를 호출할때 인자로 들어갈 버퍼의 크기와 데이터를 미리 알고 있으니 해당 버퍼를 넘겨주면 문제가 되지 않는데 반대로 Receive할땐 저희가 얼마만큼의 버퍼가 들어올지 모르니 (영상에서)1024크기의 바이트 배열로 선언하였는데 실제로

Socket.Receive(buff), SocketAsyncEventArgs.SetBuffer(buff, 0, buff.Length)

에 들어온 데이터가 1024 배열 크기보다 크다면 짤리나요? 아니면 1024는 임시 공백 크기이고 실제로 들어올땐 크기에 상관없이 들어온 데이터 배열이 덮어쓰나요?

답변 3

2

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

우리가 네트워크 통신을 할 때
커널(운영체제가 관리하는 영역)에서도 송수신 데이터 저장용 버퍼가 만들어집니다.
따라서 유저 레벨(우리 서버)에서 우리가 Send/Recv할 때는
일단 커널 레벨에 있는 버퍼에 있는 데이터를 복사해서 사용한다고 보시면 됩니다.

참고로 TCP 프로토콜은 커널 버퍼가 어느 정도 찼는지를 보고
서로 데이터 전송하는 속도를 조절하기도 합니다.

1

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

정답은 Recv 완료 통지되는 데이터 자체가 1024 보다 클 수 없습니다.

상대방이 4000바이트를 보냈다 하더라도
그것을 꼭 프로그램에서 한방에 4000바이트를 받아야 하는 것은 아닙니다.
커널 버퍼에 4000을 쌓아놨다가,
유저 레벨에서 야금 야금 꺼내가는 만큼 위로 건내주면 되기 때문이죠.
네트워크 통신에서 Recv 계열 함수를 호출할 때
유저 레벨에서 받을 수 있는 버퍼 크기를 같이 지정(현재는 SetBuffer 1024)해주게 되는데
그 크기를 넘어서 데이터를 받지 않습니다.

그리고 TCP는 애당초 패킷간 경계의 개념이 없습니다.
그러니 유저레벨에서 알아서 조립해서 사용해야 하는데
이는 강의 중후반부에 나오니 생략하겠습니다.

0

WolLu님의 프로필 이미지
WolLu
질문자

추가로 위와는 다른 질문이지만 진행하던 프로젝트를 실행하면 더미 클라이언트가 총 5번의 메세지를 보내고 그걸 서버가 받아서 출력하는데 

[From Client] Hello World! 0

Transferred bytes: 26

[From Client] Hello World! 1Hello World! 2Hello World! 3Hello World! 4

[From Client] Hello World! 0Hello World! 1Hello World! 2Hello World! 3Hello World! 4

Transferred bytes: 26

위와 같이 처음엔 클라이언트가 5번 보내기도 전에 서버가 Receive해서 HelloWorld 0만 출력되고 다음 Receive때 전에 못 받았던 1,2,3,4 데이터를 받아오는데 대체 해당 데이터는 어디에 저장되어 있다가 가져오는건가요?

WolLu님의 프로필 이미지
WolLu

작성한 질문수

질문하기