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

leomessi님의 프로필 이미지
leomessi

작성한 질문수

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

SendBuffer

에러가 발생합니다..

작성

·

4.4K

0

dummyClient측에서 sendAsync를 하려고 할 때.. 에러가 발생합니다.

에러 내용

Unhandled exception. System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Sockets.Socket'.
   at System.Net.Sockets.Socket.SendAsync(SocketAsyncEventArgs e, CancellationToken cancellationToken)
   at System.Net.Sockets.Socket.SendAsync(SocketAsyncEventArgs e)
   at ServerCore.Session.RegisterSend() in /Users/mini/Desktop/projects/Game/MMO_Server_Tutorial/ServerCore/Session.cs:line 71
   at ServerCore.Session.Send(ArraySegment`1 sendBuff) in /Users/mini/Desktop/projects/Game/MMO_Server_Tutorial/ServerCore/Session.cs:line 57
   at DummyClient.GameSession.OnConnected(EndPoint endPoint) in /Users/mini/Desktop/projects/Game/MMO_Server_Tutorial/DummyClient/Program.cs:line 20
   at ServerCore.Connector.OnConnectCompleted(Object sender, SocketAsyncEventArgs args) in /Users/mini/Desktop/projects/Game/MMO_Server_Tutorial/ServerCore/Connector.cs:line 42

그리고 찍히는 로그가.. 좀 이상한 것 같은데요..

[From Server]: 메시지

OnDisconnected: [fe80::1%1]:7777

OnConnected: [fe80::1%1]:7777

이러고 나서 바로 위 에러가 나버립니다.

도저히 원인을 찾을 수 없을 것 같아서 질문 남겨드립니다..

답변 2

1

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

강의 코드가 100% 완벽하진 않아서 
중간 중간 try-catch가 누락된 부분이 있을 수 있습니다.
크래시 나는 쪽 코드에 try -catch 추가해주시기 바랍니다.
에러 메시지는 이미 연결이 끊긴 Socket을 대상으로 read/write/close 등을 할 때 일어나는 상황으로 보입니다.

System.ObjectDisposedException: Cannot access a disposed object.
관련하여 아래 문서 참고 바랍니다.
https://docs.microsoft.com/ko-kr/dotnet/api/system.objectdisposedexception?view=net-5.0

해결이 되지 않으면 rookiss@naver.com로
전체 프로젝트 압축후 보내주시기 바랍니다.

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

제가 중간에 실수를 해서 OnReceiveCompleted 함수 내용 중에서 틀린 점이 있었는데요,

int processLength = OnReceive(_recvBuffer.ReadSegment);

로 작성해야 했던 것을

int processLength = OnReceive(new ArraySegment<byte>(_recvBuffer.ReadSegment.Array));

라고 잘못 작성했습니다.

OnReceive 함수에 ReadSegment 대신 버퍼를 통째로 넘기는 바람에, DataSize보다 processLength가 더 커지게 되었고, 그 결과 Disconnect가 호출된 이후에 Send가  처리되어서 위와 같은 오류가 발생하게 된 것 같습니다.

Disconnect를 하기 전에 로그를 찍어줬다면 실수를 줄일 수 있었을텐데.. 덕분에 잘 배웠습니다.

늦은 시간에 답변주셔서 감사합니다.

0

연결하고 바로 연결을 끊는 경우 발생합니다. 아래 python 코드로 테스트 해보시면 됩니다.

import socket


def check_tcp_connection(ip, port):
    try:
        # Create a new socket using the given IP and port
        with socket.create_connection((ip, port), timeout=5) as s:
            print(f"Successfully connected to {ip} on port {port}")
    except socket.error as e:
        print(f"Failed to connect to {ip} on port {port}. Error: {e}")


if __name__ == "__main__":
    target_ip = "your ip"
    target_port = int("7777")

    check_tcp_connection(target_ip, target_port)
leomessi님의 프로필 이미지
leomessi

작성한 질문수

질문하기