공부한거 잊었을 때 보려고 만든 블로그

NetworkStream.Read() 뻗음 (C# 소켓 통신할 때 주의할 점) 본문

서버 프로그래밍

NetworkStream.Read() 뻗음 (C# 소켓 통신할 때 주의할 점)

Parcon 2023. 3. 28. 17:41

NetworkStream.Read() 함수는 지정한 byte를 다 읽을 때까지 코드가 blocking된다.

그래서 보통while(true) 안에서 Read() 하며, blocking이 되기 때문에 무한루프에 빠지는 경우가 잘 없다.

 

가끔 읽지 말아야할 때가 있어서 조건문으로 Read 함수를 감싸는 경우

if문을 건너뛰면 Read의 Blocking이 사라져 무한루프가 되면서 프로그램이 뻗을 수 있다.

 

나는 Unity 환경에서 돌리고 있어서 while 대신 Update문에서 if 조건을 걸고 Read하는 상태로 바꿨다.


두번째로 주의할 점은 원인이 이게 맞는지 모르겠는데,

 

문자열 길이를 먼저받고 그 길이만큼 문자열을 받는 코드에서 서버와 클라이언트 간 통신할 때 패킷이 손실되면

문자열의 길이가 이상하게 들어올 때가 있다.

 

그 길이만큼 읽으려다보면 오버플로우가 나서 프로그램이 뻗었고

내가 보내는 패킷이 아무리 길어도 300자 이상 보낼 일이 없었기 때문에 300자가 넘으면 처리하지 않도록 예외처리를 했다.