Existe uma maneira para consultar um soquete em C # somente quando algo está disponível para leitura?

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

  •  12-09-2019
  •  | 
  •  

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

Foi útil?

Solução

De acordo com a documentação do MSDN, existem três causas que retornam verdadeiro para

Poll(microSeconds, SelectMode.SelectRead);

  1. se Listen() foi chamado e uma conexão está pendente
  2. Se os dados está disponível para leitura
  3. Se a conexão foi fechada, reset, ou rescindido

Vamos ver se podemos discriminá-los:

  1. Você sempre sabe se Listen() foi chamado antes, assim você não precisa considerar essa causa se você não tem.
  2. Ok, você vai para isso.
  3. 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:

  1. não precisa ser considerado

  2. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top