1

StreamSocketListener을 사용하여 포트 연결을 기다리고 있습니다. 나는 그것이 영원히 듣기를 원하지 않는다. 그것은 다음과 같은 코드를 사용하고있는 초 수를 특정 시간 후에 취소해야한다.작업이 지정된 시간 초과 후 취소되지 않았습니다.

remoteListener = new StreamSocketListener(); 
    try 
    { 
     CancellationTokenSource ctsTimeout = new CancellationTokenSource(); 
     ctsTimeout.CancelAfter(1000); // in milliseconds 
     await remoteListener.BindServiceNameAsync(receivingPortForRemoteRequests.ToString()).AsTask(ctsTimeout.Token); 
     remoteListener.ConnectionReceived += remoteListener_ConnectionReceived; 
    } 
    catch (Exception exc) // supposed to produce a TaskCanceledException 
    { 
     isCancelled = true; 
    } 

내 문제는이 코드는 시간의 간격 후 Exception을 던져 결코이지만, 단지 듣기 유지합니다. 이 코드는 this MSDN page에서 찾은 내용을 기반으로합니다.

내가 뭘 잘못하고 있는지 아는 사람이 있습니까? 미리 감사드립니다!

+1

나는 꺼져있을 수도 있지만 connectasync의 일부 형식이 필요하지 않습니까? 또는 StreamSocketConnectOperation (ctsTimeout.token을 매개 변수로 사용) – GamerJ5

+0

@ GamerJ5 포트에서 TCP 연결을 수신합니다. 'ConnectionReceived' 이벤트에서, 입출력 스트림을 통해 클라이언트에 읽고 쓸 수있는'StreamSocket'을 얻습니다. 그것은 괜찮아, 난 그냥 시간 초과 후 해당 포트에서 수신을 중지 얻을 수 없습니다 작동합니다. –

+0

@ GamerJ5 : "연결"작업은 클라이언트에 의해 시작됩니다. 위의 코드는 서버에서 가져온 것입니다. –

답변

2

난 당신이 만든 차 실수는 당신이 실제로 을 수신하는 모든 작업을 소켓에 결합하는 작업에 취소 토큰을 전달하고되지 않는다는 것을 말할 것입니다. 바인딩 작업은 단순히 소켓에 포트를 할당하고 일반적으로 최악의 경우에 밀리 세컨드 이내에 완료 할 것이고 일반적인 경우에는 훨씬 빠를 것입니다. 이 작업이 1 초 후에 진행될 수있는 방법은 없습니다.

질문이 명확하게 나와있는 Minimal, Complete, and Verifiable example이 없으면 철저한 답변을 드릴 수 없습니다. 그러나 몇 가지 제안 :

  1. 먼저 취소 토큰을 사용하지 마십시오. 소켓을 듣지 못하게하는 방법이 아닙니다. 대신, 필요한 시간 후에 소켓을 닫으십시오. 이를 위해 타이머를 사용하거나 먼저 await Task.Delay(...)을 호출 한 다음 소켓을 닫는 async 메서드를 사용할 수 있습니다.
  2. 취소 토큰을 사용하는 것이 적절한 시나리오 인 경우 TaskCanceledException 만 잡아야합니다. 안 함 일상적인 예외 처리에는 catch (Exception)을 사용합니다. 적절한 장소는 단순히 예외를 기록하거나 달리보고하고 프로세스를 종료하려는 시나리오입니다. 그렇지 않으면 기대 한 예외 만 잡으십시오. 처리해야 할 예외가 있습니다.
  3. 이벤트 에 가입해야 소켓을 바인딩 할 수 있습니다. 그렇지 않으면 코드를 이벤트를 통해 통지 할 준비가되기 전에 연결 시도가 이루어질 가능성이 있습니다 (매우 작고 허용됨).

위의 첫 번째와 세 번째 사항은이 클래스의 올바른 사용법에 대한 유용한 요약이있는 MSDN 설명서에서 다루고 있습니다. the documentation for StreamSocketListener에서 다음과 같이

작업의 일반적인 순서는 다음과 같습니다
•이 StreamSocketListener를 만듭니다.
? Control 속성을 사용하여 StreamSocketListenerControl 개체를 검색하고 필요한 소켓 서비스 품질을 설정합니다.
• ConnectionReceived 이벤트를 이벤트 처리기에 할당합니다.
• BindServiceNameAsync 또는 BindEndpointAsync 메서드를 호출하여 로컬 TCP 포트 번호 또는 서비스 이름에 바인딩합니다. Bluetooth RFCOMM의 경우 로컬 서비스 이름 매개 변수는 Bluetooth 서비스 ID입니다.
• 연결을 받으면 StreamSocketListenerConnectionReceivedEventArgs 개체를 사용하여 만든 StreamSocket 개체로 Socket 속성을 검색합니다.
? StreamSocket 개체를 사용하여 데이터를 보내고받습니다.
? 들어오는 네트워크 연결 수신 대기 및 수신을 중지하고 StreamSocketListener 개체와 관련된 관리되지 않는 모든 리소스를 해제하려면 Close 메서드를 호출하십시오. 접속을 받았을 때에 작성된 StreamSocket 객체는 영향을받지 않고 필요에 따라서 계속 사용할 수 있습니다.

+0

자세한 답장과 팁을 보내 주셔서 감사합니다! 첫 번째 요점을 구현하여 작동하도록했습니다. –