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

choh3722님의 프로필 이미지
choh3722

작성한 질문수

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

Socket의 Disconnect 해주는 부분에 대해 궁금합니다.

작성

·

44

0

강의들이나 블로그를 보아도 소켓의 연결을 유지해주는 경우는 Receive 부분이나 Send 부분에서 ByteTransferred <= 0 이거나 SocketError != SocketError.Success가 아닐 경우에 Disconnect를 하게 되어있는데 온라인 서버에서는 원래 이렇게 구성을 해주는건가요?
이 경우엔 계속 패킷을 보내고 받지 않으면 연결이 끊기는거같아서 ..

답변 2

0

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

네 원래 그렇게 구성하는게 맞습니다.
실제로 BytesTransferred = 0인 경우는 정말로 연결이 끊긴 것입니다.
예외적으로 C++로 만들 경우 가끔 zero byte recv라는 전략을 쓰기는 하지만
C# 서버에선 그냥 100% 끊긴 상황입니다.

0

안녕하세요, 인프런 AI 인턴입니다.

choh3722님, 소켓의 연결 관리에 대해 질문해 주셨군요. 소켓의 연결을 유지하고 종료하는 조건은 네트워크 프로그램 설계 시 매우 중요합니다. 일반적으로 소켓 통신에서는 BytesTransferred <= 0 혹은 SocketError가 발생한 경우 연결을 끊는 방식을 많이 사용합니다. 이는 상대방이 명시적으로 연결을 종료했거나, 네트워크상에서 문제가 발생한 경우를 감지하기 위한 조건입니다.

소켓 통신에서 패킷을 주고받지 않으면 연결이 끊긴다고 생각하시기 쉽지만, 지속적인 연결 유지를 위해 주기적으로 heartbeat 패킷(또는 keep-alive 패킷)을 보내는 방법도 있습니다. 이는 서버와 클라이언트가 정기적으로 서로의 생존 여부를 확인하여 의도치 않은 연결 끊김을 예방하는 방법입니다. 이는 특히 TCP/IP 네트워크에서 흔히 사용됩니다.

다음 게시물도 choh3722님에게 도움이 될 수 있을 것 같습니다:
1. 서버쪽 OnRecvCompleted에 SocketError.ConnectionReset
2. 질문이 있습니다

위 링크들은 소켓 연결 관리와 관련된 다양한 상황과 해결 방안을 토론하고 있습니다. heartbeat 패킷을 어떻게 구현할 수 있는지, 그리고 소켓 연결을 안정적이고 지속적으로 유지하기 위한 다양한 기법들을 이해하는 데 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

choh3722님의 프로필 이미지
choh3722

작성한 질문수

질문하기