읽을 수 있는 항목이 있는 경우에만 C#에서 소켓을 폴링하는 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/1249643

  •  12-09-2019
  •  | 
  •  

문제

조건(데이터를 읽을 수 있음) 중 하나만 만족할 때 C#에서 소켓을 폴링하는 방법이 있는지 궁금합니다. 소켓.Poll 메서드이지만 지정된 3가지 조건 중 하나라도 여기에 지정된 대로 true를 반환하면 true를 반환할 수 있습니다. MSDN:소켓.폴

도움이 되었습니까?

해결책

MSDN 문서에 따르면 true를 반환하는 세 가지 원인이 있습니다.

Poll(microSeconds, SelectMode.SelectRead);

  1. 만약에 Listen() 호출되었으며 연결이 보류 중입니다.
  2. 데이터를 읽을 수 있는 경우
  3. 연결이 종료, 재설정, 종료된 경우

우리가 그들을 구별할 수 있는지 봅시다:

  1. 당신은 항상 알고 Listen() 이전에 호출되었으므로 호출되지 않은 경우 해당 원인을 고려할 필요가 없습니다.
  2. 좋아, 그렇게 하세요.
  3. 이는 Poll() 호출에 머물 수 없으며 실제로 무슨 일이 일어났는지 알아내야 함을 의미합니다.한 가지 옵션은 소켓 상태를 즉시 확인하는 것입니다. Poll() 돌아왔다.

결론:

  1. 고려할 필요는 없다

  2. 그리고 3.true가 반환될 때마다 소켓 상태를 확인하여 처리할 수 있습니다.

그래서 나는 (테스트되지 않은) 다음을 갈 것입니다.

if (s.Poll(microSeconds, SelectMode.SelectRead)))
{
  if (!s.Connected)
    // Something bad has happened, shut down
  else
    // There is data waiting to be read"
}

다른 팁

사용 가능한 소켓 속성을 사용할 수 있습니다. 읽을 수있는 데이터의 양을 반환합니다.

클래스 네트워크 스트림에서 무언가를 찾았습니다. 재산 NetworkStream.dataavailable 데이터를 읽을 수있는 경우 true를 반환합니다. NetworkStream의 객체는 tcplistener 및 tcpclient를 다루는 것으로 반환됩니다. 이것은 소켓보다 높은 추상화 수준입니다.

소켓에서 네트워크 스트림으로 올 방법을 찾지 못했습니다. NetworkStream은 소켓을 사용하고 있으며 소켓의 스트림 표현입니다. 그러나 나는 네트워크 스트림이 소켓으로 무엇을하고 있는지 모른다.

기본 핸들에서 select () 시스템 호출을 사용할 수 있습니다.

poll () 대신 select () 메소드를 사용할 수 있습니다. 실제로 ilspy (반사기 도구)와 함께 socket.poll을 살펴보면 내부 코드가 소켓에서 선택을 호출합니다.

또한 단단한 루프로 poll ()을 호출하면 각 호출마다 새로운 intptr []가 수행되므로 메모리 할당이 증가합니다. Select ()을 호출하면 후드 아래에 새 제품을 할당하는 대신 배열을 재사용 할 수 있습니다.

청취가 호출되고 연결이 계류 중이면 사실입니다. 데이터를 읽을 수있는 경우 또는 TRUE; 또는 연결이 닫히거나 재설정되거나 종료 된 경우; 그렇지 않으면 거짓을 반환합니다.

두 번째 옵션이 True가 돌아 오는 옵션인지 확인하고 싶습니까? 설문 조사가 진실을 반환하는지 확인한 후 연결이 열려 있는지 확인할 수 있습니다. 즉,이를 의미합니다. 연결, 닫히거나 재설정 또는 종료되지 않습니다.

그것이 열려 있다면, 그것은 두 번째 옵션이 true를 반환합니다.

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