2017-12-12 4 views
0

방금 ​​.Net (Core 2)의 UDPClient로 작업하기 시작했습니다. 수신시 실제로 "원격 연결이 끊어진 연결"예외가 발생할 수 있음을 알 수 있습니다. UDP는 리모컨을 고려하지 않기 때문에 이것은 나에게별로 의미가 없습니다.왜 UDP 소켓에 대한 원격 폐쇄 연결 예외가 있습니까?

응용 프로그램에서 UDP 데이터를 수신합니다. 제어 할 수 없습니다. 내가 뭘 짧은 일은 이것이다 :의 수명 동안 그러나

if(MyUDPClient.Available > 0) 
{ 
    IPEndPoint Point = null; 
    Byte[] Data = MyUDPClient.Receive(ref point); 
    //[do something with data] 
} 

말했다 응용 프로그램 (내가 데이터를받을 때, 위의 루프에서 수행), 수신 할 수있는 호출이 원격 폐쇄했다고 예외를 던질 수있는 연결 (그것은하지 않았다. ..).

왜이 예외가 심지어 어쩌면 해결 방법 일지 설명 할 수 있습니까? 내가 원하는 모든 것은 데이터를 수신하고 그것이 끝내주는 엔드 포인트를 식별하는 것입니다.

+0

최소 코드 샘플을 제공해주십시오. MyUDPClient를 초기화하는 방법을 보지 않고서는 문제가 무엇인지 추측 할 수 있습니다. 기본 생성자를 사용하여 MyUDPClient를 구성한 것일 수 있습니다. 즉, 로컬 포트 ​​/ 로컬 끝점을 제공하지 않았습니다. 이 경우 MyUDPClient.Available은 사용 가능한 데이터를 찾을 위치를 알 수 없으므로 실패합니다. 하지만 당신 말이 맞습니다. 리모컨이 연결을 닫았다는 예외는 매우 오해의 소지가 있습니다. 아마도 UDPClient가 로컬 포트에 바인딩되어 있지 않다는 것을 의미합니다. – Xaver

+0

일부 파고가 발견되면 UDP 소켓은 소켓을 닫은 끝점으로 데이터를 보내려고하면이 오류가 발생합니다. UDPSocket에서 읽을 데이터가있을 수 있지만 마지막 전송이 성공하지 못했기 때문에 예외가 발생합니다. Control-Flag를 사용하면이를 무시할 수 있습니다. 나는 대답을 추가 할 것이다. –

답변

0

조금 깊게 파고 들자 마자 다른 설명이 나온 것을 stackoverflow에서 발견했습니다. Source Answer
짧게 : 리모컨이 소켓을 닫았 기 때문에 UDPClient.Send가 실패하면 다음 Receive (데이터가 있어도 그 이유는> 0)가 예외를 트리거합니다. 설정할 Controlflag가 있는데이를 무시할 수 있습니다. 어쨌든 나는 리모컨에 관심이 없기 때문에 리모트 머신에서 "도달 할 수없는"반응은 신경 쓰지 않습니다.

var udpClient = new UdpClient(); 
uint IOC_IN = 0x80000000; 
uint IOC_VENDOR = 0x18000000; 
uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12; 
udpClient.Client.IOControl((int)SIO_UDP_CONNRESET, new byte[] { Convert.ToByte(false) }, null);