20250526 개발일지. 버그 원인 분석 및 수정
10시 45분쯤 공유오피스 도착
# 에러메세지 및 에러 분석
System.InvalidOperationException: 'An asynchronous socket operation is already in progress using this SocketAsyncEventArgs instance.'
소켓인수 재사용 문제인 것 같음. 1명일 경우 문제 없는데 2명 이상일 때 문제 발생. -> 브로드캐스트과정에서 saea 인수를 사용한 Send 또는 Recv 작업이 완료 이벤트 전에 또 호출 될 경우 문제 발생 -> 샌드 큐를 만들어 문제 해결
유저id가 예상과 다르게 표시되는 문제 발생. 더미 클라 2개로 테스트 시 브레이크 포인트를 찍고 천천히 진행하면 서버 세션1 -> 유저 세션0 에 메세지 전달 로그 하나만 뜨고 브레이크 포인트를 안찍고 진행할 경우 로그 4개가 표시되지만 User_0에 도달 로그가 없음.
브레이크 포인트를 찍고 로그 출력
Hello, Client!
[TestSession_1 -> User_0]: Test Message
브레이크 포인트를 안찍고 로그 출력
Hello, Client!
[TestSession_1 -> User_1]: Test Message
[TestSession_2 -> User_1]: Test Message
[TestSession_1 -> User_1]: Test Message
[TestSession_2 -> User_1]: Test Message
5명으로 실행 시 User_4로만 표시됨. 제일 마지막 유저로 표시되는 듯
더미 클라이언트 프로그램의 더미 클라이언트 개수를 1개로 설정하고 여러 프로세스(더미 클라이언트 프로그램)를 실행하면 예상대로 잘됨
더미 클라이언트를 2개로 설정하고 여러 프로세스를 실행하면 똑같은 문제 발생
와이어샤크 패킷확인 결과 더미 클라이언트로 보내는 메세지의 유저id 값이 전부 1인것을 발견
더미 클라이언트를 4개로 설정하고 실행 -> 유저 한명의 메시지를 다른 4명에게 브로드캐스트해야하므로 더미 클라이언트에 16개의 로그가 찍혀야하는데 8개가 찍히고 받는 클라이언트는 마지막으로 생성된 클라이언트만 메세지를 받음
와이어샤크에서 패킷이 같은 포트에서 4개 데이터 전송 후 포트 당 2개 씩 브로드캐스트 패킷을 받아 총 8개 패킷만 들어옴 -> 클라이언트도 문제가 있는 것으로 보임 -> 더미 클라이언트 생성 때 사용하는 글로벌 변수를 브로드캐스트할때 그대로 사용하여 마지막 생성된 세션으로만 전송했음
더미 클라이언트 4개
Hello, Client!
[TestSession_2 -> User_3]: Test Message
[TestSession_1 -> User_3]: Test Message
[TestSession_3 -> User_3]: Test Message
[TestSession_4 -> User_3]: Test Message
[TestSession_2 -> User_0]: Test Message
[TestSession_1 -> User_0]: Test Message
[TestSession_3 -> User_0]: Test Message
[TestSession_4 -> User_0]: Test Message
받는 클라이언트 수는 늘어났지만 로그 수는 똑같고 아직도 일부 클라이언트만 패킷을 받음
Hello, Client!
[TestSession_1 -> User_0]: Test Message
[TestSession_2 -> User_0]: Test Message
[TestSession_1 -> User_1]: Test Message
[TestSession_2 -> User_1]: Test Message
더미 클라이언트가 2개일때는 정상 출력되는데 늘어나면 일부 클라이언트만 패킷 받음
더미 클라이언트 4개로 테스트 진행 후 와이어샤크에서 확인한 결과 더미 클라에서 4개 보내고 서버에서 16개 패킷 받는 것을 확인했는데 콘솔로그로 표시되지 않음 -> 서버 브로드캐스트 후 스레드 대기를 1초 걸어주었더니 패킷을 전부 정상적으로 받았다
브로드캐스트 주기가 짧아서 Receive 작업을 못한 것 같다
## 결론
Send 또는 Recv 작업 완료 전 다시 메소드 실행하여 에러 발생하던 문제와 작성한 코드의 버그가 있어 이상하게 동작하던 문제를 해결함