2014-03-25 4 views
0

내가 A A비동기 소켓 및 청소 자원

listener.BeginAcceptSocket(cbConnect, listener); 

에서 콜백 내 콜백 메소드가있는 경우 :

Public class MyObj 
{ 
    public Socket socket; 
    public byte[] buffer = new byte[1080]; 
} 

내 질문은 : 여기

private void cbConnect(IAsyncResult ar) 
{ 
    TcpListener listener = (TcpListener)ar.AsyncState; 
    MyObj myObj = new MyObj(); 
    myObj.socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    myObj.socket = listener.EndAcceptSocket(ar); 
    listener.BeginAcceptSocket(cbConnect, listener);//start listening again 
    myObj.socket.BeginReceive(myObj.buffer, 0, myObj.buffer.Length, 0, cbReceive, myObj); 
} 

는하여 MyObj 클래스입니다 연결의 다른 쪽 끝에있는 클라이언트가 myObj에 어떤 일이 일어날 지 아무 데이터도 보내지 않으면 어떻게됩니까? 소켓을 닫고 리소스를 청소하려면 어떻게해야합니까?

답변

1

원격 연결이 끊어지면 가비지 수집기를 통해 자체 소켓을 정리해야합니다.

+0

연결이 끊어지지 않았지만 데이터가 전송되지 않으면 GC가 myObj를 정리합니까? –

+0

아니요. 유휴 시간 제한을 설정하려면 소켓을 닫는 타이머를 설정해야합니다. 프로토콜을 설정하여 유휴 시간 초과 알림을 상대방에게 보낼 수 있으므로 연결이 끊어진 이유를 알 수 있습니다. 소켓을 닫으면 비동기 수신이 중지되고 myObj에 대한 참조가 떨어지며 GC는 다음 패스에서이를 모두 수집합니다 (참조가없는 것으로 가정 할 경우). – Charlie

+0

조언 해 주셔서 감사합니다. –