2009-08-08 2 views

답변

5

Listen()가 호출 된 경우

Poll(microSeconds, SelectMode.SelectRead);

  1. 에 대해 true를 반환하는 세 가지 원인은 다음과 연결이
  2. 를 읽어 데이터를 사용할 수있는 경우
  3. 이 아직되지 않고 있습니다 연결이 닫히거나 재설정되거나 종료 된 경우

우리가 그들을 차별 할 수 있는지 보자 :

  1. 당신은 항상 알고 Listen()가 이전에 호출 된 경우, 당신은 당신이하지 않은 경우 그 원인을 고려할 필요가 없습니다.
  2. 좋아, 그거야.
  3. Poll() 호출에 머물 수 없으므로 실제로 발생한 문제를 찾아야합니다. 한 가지 옵션은 Poll()이 반환 된 직후 소켓의 상태를 확인하는 것입니다.

결론 :

  1. 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" 
} 
+0

답변 해 주셔서 감사합니다. –

+0

어쨌든 Connected가 읽은 것처럼 읽기 전에 먼저 Write to poll 또는 poll을 호출하기 전에 Connected를 선택해야합니다. – Jay

1

NetworkStream 클래스에있는 항목을 찾습니다. 속성 NetworkStream.DataAvailable은 데이터를 읽을 수있는 경우 true를 반환합니다. TcpListener 및 TcpClient를 처리하는 networkstream 객체가 반환됩니다. 이것은 소켓보다 하나 높은 추상화 레벨입니다.

Socket을 NetworkStream으로 가져올 방법이 없습니다. NetworkStream은 소켓을 사용하고 있으며 소켓의 스트림 표현입니다. 하지만 네트워크 스트림이 소켓에서 무엇을하는지 알지 못합니다.

1

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

+1

내 첫 번째 생각도 있지만 어두운 별이 실제로 의미하는 것이면 shure하지 마세요. – Christian13467

0

Listen이 호출되어 있고 연결이 보류중인 경우 true입니다. - 또는 - 데이터를 읽을 수있는 경우 true입니다. - 또는 - 연결이 닫히거나 재설정되거나 종료 된 경우 true입니다. 그렇지 않으면 false를 반환합니다.

두 번째 옵션이 true를 반환하는지 확인하고 싶습니다. Poll이 true를 반환하는지 확인한 후 연결이 열려 있는지 확인할 수 있습니다. 연결되지 않음, 닫힘, 재설정 또는 종료 됨.

열려있는 경우 두 번째 옵션은 true를 반환합니다.

+0

: if (m_sock.Poll (-1, SelectMode.SelectRead) && (m_sock.Connected == true))? –

+0

나는 그럴 것이라고 생각한다. – Phoexo

4

Socket 속성 Available을 사용할 수 있습니다. 읽을 수있는 데이터의 양을 반환합니다. MSDN 설명서에 따르면

1

당신은 선택() 대신 설문 조사의 방법()를 사용할 수 있습니다. 사실 ILSpy (반사체 도구)를 사용하여 Socket.Poll을 조사 할 때 내부 코드는 소켓에서 select를 호출합니다.

또한 tightly 루프에서 Poll()을 호출하면 각 호출에서 새로운 IntPtr []가 수행되므로 메모리 할당이 증가합니다. Calling Select()를 호출하면 배열을 새로 할당하는 대신 배열을 다시 사용할 수 있습니다.