소스코드를 대략 살펴봤는데, 서버의 “DISCONNECT” 에 리스너 소켓을 Disconnect() 호출하셨는데요, 이것은 잘못된 코드 입니다. 리스너에 의해 연결된 Socket을 닫으셔야 하고요, 소스코드에서는 클래스에서 별도의 연결 소켓을 가지고 있지 않는데 이를 클래스 필드로 저장해뒀다가, 닫을 때 리스너 소켓이 아닌 이 연결 소켓을 닫아주셔야 합니다.
클라이언트나 서버에서 서로 BeginReceive()으로 수신을 대기하고 있으므로, 연결이 끊겼을 때 이를 이곳에서 감지합니다. 감지된 것으로 종료 처리를 진행할 수 있습니다.
문제가 해결되었다면 포럼의 다른 분들을 위해 시행착오를 정리해서 댓글로 적어주시면 감사할께요. 그래야 계속되는 질문과 답변의 선순환이 이루어진다고 생각합니다.