작성
·
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
강의 코드가 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로
전체 프로젝트 압축후 보내주시기 바랍니다.
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)
제가 중간에 실수를 해서 OnReceiveCompleted 함수 내용 중에서 틀린 점이 있었는데요,
로 작성해야 했던 것을
라고 잘못 작성했습니다.
OnReceive 함수에 ReadSegment 대신 버퍼를 통째로 넘기는 바람에, DataSize보다 processLength가 더 커지게 되었고, 그 결과 Disconnect가 호출된 이후에 Send가 처리되어서 위와 같은 오류가 발생하게 된 것 같습니다.
Disconnect를 하기 전에 로그를 찍어줬다면 실수를 줄일 수 있었을텐데.. 덕분에 잘 배웠습니다.
늦은 시간에 답변주셔서 감사합니다.