2011-01-07 2 views
3

1) 프로세스가 끝날 때까지 소켓이 LocalEndPoint에서 바인딩 해제되지 않는 것처럼 보입니다.
2) 나는 다른 질문에서 해결책을 시도해 보았고 또한 잠깐 기다려 보았다. 아무 소용이 없었다.
3) 순간 내가 소켓과의 연결을 제거하기 위해 아래 시도 :프로그래밍 방식으로 소켓을 "바인딩 해제"하는 방법은 무엇입니까?

public static void killUser(User victim) 
    { 
     LingerOption lo = new LingerOption(false, 0); 
victim.connectedSocket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Linger,  lo); 
     victim.connectedSocket.Shutdown(SocketShutdown.Both); 
     victim.connectedSocket.Disconnect(true); 
     victim.connectedSocket.Close(); 
     clients.RemoveAt(victim.ID); 
    } 

4) 인터넷 검색 조금 후에, 나는 포트 바인딩을 해제 할 수없는 것, 따라서 충분한 양의 연결 클라이언트가있는 경우에는 결국 포트를 모두 사용하여 수신 대기하게됩니다.

+0

"다른 질문"은 무엇입니까? – Gabe

답변

7

연결된 클라이언트의 소켓을 서버 소켓과 혼동시키는 것 같습니다.

서버 소켓은 특정 포트에서 들어오는 연결을 수신 대기하는 서버 소켓입니다. 이 함수에서 닫는 소켓은 (잠재적으로 많은) 원격 연결 중 하나에 대한 파이프입니다.

"포트의 바인딩을 해제하려면"서버 소켓을 종료하거나 닫으십시오.

업데이트가 들어 봐요()를 호출 다음에 약간의 혼동

당신은 당신이에 .Bind (를 EndPoint)에 전화를 만든 "서버"소켓을해야을 취소합니다. 이 소켓은 셧다운/닫기를 "언 바인드 (unbind)"하고 나중에 포트를 확보 할 소켓입니다.

그런 다음 "서버"소켓이 새 연결을 허용 할 때마다 참조하는 여러 개의 "클라이언트"소켓이 있습니다. 이들은 모두 문제없이 동일한 포트에 바인딩 될 수 있습니다. 이러한 연결 중 하나를 닫고 클라이언트 연결을 끊으려면 지금하고있는 일을하십시오. 목록에서

을 분리하고 나머지 불필요한을 제거

  • 닫기

    • 종료 : 당신은 실제로에게 방법을자를 수 있습니다.

  • +0

    난 그냥 연결을 죽이고, 사용자가 안전하지 않게 연결을 해제하거나 연결을 끊을 때 포트를 비울 수있는 방법을 궁금하게 생각하고있었습니다. 편집 : 잠재적으로 닫고 싶습니다 소켓 많은 클라이언트 소켓 중 하나가 될 것입니다. ATM 잠재적 인 클라이언트를 청취하는 하나의 소켓이있는 경우, 클라이언트는 다시 연결할 포트 번호를 수신합니다. 포트 당 포트 1 개/포트 당 하나의 클라이언트 만 연결할 수 있다고 생각하면됩니다. (내 생각 엔) – ryan1894

    +0

    잠재적 인 클라이언트를 청취하는 "하나의 소켓"이 .Bind()를 호출하는 시점이 있었습니까? 엔드 포인트를 지정한 곳 (포트가 있어야 함)? 이 포트는 클라이언트가 연결해야하는 단일 포트입니다 (그리고 단일 포트에 많은 클라이언트 소켓을 연결할 수 있습니다). ** 할 수없는 일은 ** 두 번째 서버 소켓 **을 시작하는 것입니다. ** 첫 번째 소켓을 닫음으로써 ** 첫 번째 ** 서버를 바인딩 해제 할 때까지 동일한 EndPoint에서 연결을 수신합니다. – Sapph

    +0

    "첫 번째 소켓을 닫을 때까지 (첫 번째 소켓을 닫음으로써)" 정확히 내가 겪고있는 문제입니다. 편집 : 상황은 다음과 같습니다. 포트 5900에서 청취하고 있습니다. 연결이 수신되었습니다 -> 5901에 다시 연결하십시오. 연결 성공. 클라이언트의 연결이 끊어 지므로 5901을 비우려고 시도합니다. -> 다시 시도하십시오 -> 예외 – ryan1894

    관련 문제