Existe uma maneira para consultar um soquete em C # somente quando algo está disponível para leitura?
Pergunta
Eu estou querendo saber se existe uma maneira de sondar um soquete em c # quando apenas uma das condições (de dados está disponível para leitura) está satisfeito, estou ciente do socket.Poll método, mas isso pode retornar true se qualquer número dos 3 condições especificadas retornos verdadeiros conforme especificado aqui: MSDN: Socket.Poll
Solução
De acordo com a documentação do MSDN, existem três causas que retornam verdadeiro para
Poll(microSeconds, SelectMode.SelectRead);
- se
Listen()
foi chamado e uma conexão está pendente - Se os dados está disponível para leitura
- Se a conexão foi fechada, reset, ou rescindido
Vamos ver se podemos discriminá-los:
- Você sempre sabe se
Listen()
foi chamado antes, assim você não precisa considerar essa causa se você não tem. - Ok, você vai para isso.
- significa que você não pode ficar na chamada Poll () e necessidade de descobrir o que realmente aconteceu. Uma opção é verificar o estado da tomada imediatamente após
Poll()
retornado.
Conclusão:
-
não precisa ser considerado
-
e 3. pode ser tratado por verificar o estado de soquete cada vez verdade é retornado.
Assim, gostaria de ir para (não testado):
if (s.Poll(microSeconds, SelectMode.SelectRead)))
{
if (!s.Connected)
// Something bad has happened, shut down
else
// There is data waiting to be read"
}
Outras dicas
Você poderia usar soquete propriedade disponível. Ele retorna a quantidade de dados está disponível para leitura.
algo Encontrado em NetworkStream classe. Propriedade NetworkStream.DataAvailable retorna true se os dados estão disponíveis para leitura. Objecto do NetworkStream é devolvido lidar com TcpListener e TcpClient. Este é um nível de abstração mais elevado do que tomada.
Eu não encontrei nenhuma maneira de vir de Socket para NetworkStream. Um NetworkStream está a utilizar uma tomada e é a representação de uma tomada de corrente. Mas eu não sei o que o NetworkStream está fazendo lá com o soquete.
Você pode usar a chamada de sistema select () na alça subjacente.
Você pode usar o método Select () em vez de Poll (). Na verdade, quando se olha para Socket.Poll com ILSpy (ferramenta refletor) o código interno está chamando selecione no soquete.
Além disso, chamando Poll () em um loop vai aumentar a alocação de memória como faz um novo IntPtr [] em cada chamada. Chamar Select () permite reutilizar as matrizes em vez de alocar novos sob o capô.
true se Ouça tem sido chamado e uma conexão está pendente; -ou- verdadeiro se os dados estão disponíveis para leitura; -ou- verdadeiro se a ligação ter sido fechada, a reposição, ou encerrado; caso contrário, retorna false.
Eu entendo que você deseja verificar se a segunda opção é a de retornar verdade? Depois de verificar se o Poll retorna true, você pode verificar se a conexão está aberta, o que significa; não conexão, fechado, reiniciado ou encerrado.
Se estiver aberto, então é a segunda opção de retorno verdadeiro.