문제

인사말을 나는 방법을 찾기 위해 노력하고해'해제'는 소켓에서 특정 IP/포트 조합.내 유사 코드는 다음과 같습니다:

ClassA a = new ClassA(); //(class A  instantiates socket and binds it to 127.0.0.1:4567) 
//do something 
//...much later, a has been garbage-collected away.
ClassA aa = new ClassA(); //crash here.

이 시점에서.Net 는 내가 이미 소켓밖에 없 127.0.0.1:4567,기술적으로 사실이다.하지만 상관없이 무엇인 코드에서 인터페이스 또는 멤버 하니의 소멸 또는 상관없이 기능이 나는 소켓(살려냈습니다.Close()하고 있습니다.Disconnect(true)),소켓에 자랑스럽게 남아 있는 바인딩을 127.0.0.1:4567.나는 무엇을 할 수 있'un-바인딩'소켓?


편집:나는 전적으로 의존에서 가비지 컬렉션(내가려고 하는 접근 방식으로 사용하지 않는다).나는 전화를 했다.Close()또는다.Disconnect()에서만 그 인스턴스화 aa;이것을 해결하지 않는 문제입니다.


편집:나도를 구현했 IDisposable 지만,코드가 없었어가지 않고 내 호출하는 방법(당하는 것이었의 이전 시도,방법으로 단순히 시도합니다.닫고.Disconnect).이 내려다보이는 부름입니다.폐기 직접 및시 다시 얻을 수 있습니다.


편집(을 많이 편집,사과):구현 IDisposable 및 호출.폐기()에서는'a'잃는 범위에 작동하지 않는다-내 Dispose 구현은 여전히 중 하나를 호출.닫거나.Disconnect(true)(또는.종료(모))그러나 그들의 아무도 바인딩 소켓에.

어떤 도움을 감상 할 수있다!

도움이 되었습니까?

해결책

(이 마지막으로 가지고 모든 것을 나를 위해 일)

지 확인하는 모든 소켓에서 소켓 연결하는

socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReuseAddress, true);

설정에는 시작됩니다.

다른 팁

당신은에 의존할 수 없는 개체는 쓰레기 수집에서는 C#(나는 가정 당신이 사용하는 c#에 기초하여,태그)는 경우는 리소스를 보유하음밖에 없는 네트워크 자원을에서 같은 당신의 예에서,또는 들고 일부 다른 종류의 스트림,파일 스트림이 될 것이 일반적인 예이다.

이 있을 확신하는 자원을 해제하는 물체를 들고,그래서 될 수 있는 쓰레기 수집됩니다.그렇지 않으면 되지 않습니다 쓰레기 수집 상태를 유지하면서 어딘가에 살고합니다.귀하의 의사 코드 예제를 제공하지 않는 당신이 하고 있는 리소스 풀어 놓는,당신은 그냥 주는 객체를 가져옵니다(얻어야 한다)쓰레기 수집됩니다.

쓰레기 수집가지는 소켓이 닫힙니다.에 대한 완전한 예제는 이것을 읽 MSDN 예.

주요 포인트이 실제로 전화 Socket.Close() 가능한 한 빨리.예를 들어,인터페이스 또는 멤버 하 구현할 수 있을 IDisposable 고 이를 다음과 같이 사용:

using (ClassA a = new ClassA()) 
{
    // code goes here
}
// 'a' is now disposed and the socket is closed

쓰레기 수집가 실행되는 종료자에 있는 개체의 몇 가지 불확실한 시간입니다.을 구현할 수 있습니다 IDisposable 인터페이스와 호출 Dispose()메서드의 전체 푼 범위거나 사용하여 문은 그러한 역할을 수행합니다.

http://msdn.microsoft.com/en-us/library/system.idisposable.aspxhttp://msdn.microsoft.com/en-us/library/yh598w02.aspx

편집:예쁘네요

using System;
using System.Net.Sockets;
using System.Net;

namespace ConsoleApplication1
{
    class Program
    {
        class ClassA : IDisposable
        {
            protected Socket s;
            public ClassA()
            {
                s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                s.Bind(new IPEndPoint(IPAddress.Any, 5678));
            }

            public void Dispose()
            {
                s.Close();
            }
        }

        static void Main(string[] args)
        {
            using(ClassA a=new ClassA()) {
            }
            using (ClassA b = new ClassA())
            {
            }
        }
    }
}

최고의 솔루션을 재시도하는 바인딩 소켓 몇 번(2-3).첫 번째 시도에서,그것이 실패하는 경우에,내가 찾는 것이 제대로(영구적으로)가까이 원래 소켓에.

HTH,

_NT

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top