나는 조건 (데이터를 읽을 수 있습니다) 중 하나만 만족하면 C#에서 소켓을 폴링하는 방법이 있는지 궁금하네요, 난 socket.Poll 메서드를 알고 있지만이 사실을 반환 할 수 있습니다 지정된 3 조건 중 몇 개라도 true를 반환하면 여기에 지정된대로 MSDN: Socket.Poll뭔가를 읽을 수있을 때만 C#에서 소켓을 폴링하는 방법이 있습니까?
답변
이 Listen()
가 호출 된 경우
Poll(microSeconds, SelectMode.SelectRead);
- 에 대해 true를 반환하는 세 가지 원인은 다음과 연결이
- 를 읽어 데이터를 사용할 수있는 경우
- 이 아직되지 않고 있습니다 연결이 닫히거나 재설정되거나 종료 된 경우
우리가 그들을 차별 할 수 있는지 보자 :
- 당신은 항상 알고
Listen()
가 이전에 호출 된 경우, 당신은 당신이하지 않은 경우 그 원인을 고려할 필요가 없습니다. - 좋아, 그거야.
- Poll() 호출에 머물 수 없으므로 실제로 발생한 문제를 찾아야합니다. 한 가지 옵션은
Poll()
이 반환 된 직후 소켓의 상태를 확인하는 것입니다.
결론 :
는
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 클래스에있는 항목을 찾습니다. 속성 NetworkStream.DataAvailable은 데이터를 읽을 수있는 경우 true를 반환합니다. TcpListener 및 TcpClient를 처리하는 networkstream 객체가 반환됩니다. 이것은 소켓보다 하나 높은 추상화 레벨입니다.
Socket을 NetworkStream으로 가져올 방법이 없습니다. NetworkStream은 소켓을 사용하고 있으며 소켓의 스트림 표현입니다. 하지만 네트워크 스트림이 소켓에서 무엇을하는지 알지 못합니다.
기본 핸들에서 select() 시스템 호출을 사용할 수 있습니다.
내 첫 번째 생각도 있지만 어두운 별이 실제로 의미하는 것이면 shure하지 마세요. – Christian13467
Listen이 호출되어 있고 연결이 보류중인 경우 true입니다. - 또는 - 데이터를 읽을 수있는 경우 true입니다. - 또는 - 연결이 닫히거나 재설정되거나 종료 된 경우 true입니다. 그렇지 않으면 false를 반환합니다.
두 번째 옵션이 true를 반환하는지 확인하고 싶습니다. Poll이 true를 반환하는지 확인한 후 연결이 열려 있는지 확인할 수 있습니다. 연결되지 않음, 닫힘, 재설정 또는 종료 됨.
열려있는 경우 두 번째 옵션은 true를 반환합니다.
: if (m_sock.Poll (-1, SelectMode.SelectRead) && (m_sock.Connected == true))? –
나는 그럴 것이라고 생각한다. – Phoexo
Socket 속성 Available을 사용할 수 있습니다. 읽을 수있는 데이터의 양을 반환합니다. MSDN 설명서에 따르면
당신은 선택() 대신 설문 조사의 방법()를 사용할 수 있습니다. 사실 ILSpy (반사체 도구)를 사용하여 Socket.Poll을 조사 할 때 내부 코드는 소켓에서 select를 호출합니다.
또한 tightly 루프에서 Poll()을 호출하면 각 호출에서 새로운 IntPtr []가 수행되므로 메모리 할당이 증가합니다. Calling Select()를 호출하면 배열을 새로 할당하는 대신 배열을 다시 사용할 수 있습니다.
답변 해 주셔서 감사합니다. –
어쨌든 Connected가 읽은 것처럼 읽기 전에 먼저 Write to poll 또는 poll을 호출하기 전에 Connected를 선택해야합니다. – Jay