C'è un modo per interrogare un socket in C # solo quando qualcosa è disponibile per la lettura?

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

  •  12-09-2019
  •  | 
  •  

Domanda

Mi chiedo se c'è un modo per interrogare un socket in c #, quando solo una delle condizioni (i dati sono disponibili per la lettura) è soddisfatta, sono consapevole del socket.Poll metodo, ma questo può ritornare vero se un numero qualsiasi delle 3 condizioni specificate rendimenti veri come specificato qui: MSDN: Socket.Poll

È stato utile?

Soluzione

In base alla documentazione MSDN ci sono tre cause che restituiscono vero per

Poll(microSeconds, SelectMode.SelectRead);

  1. se Listen() è stato chiamato e la connessione è in attesa
  2. Se i dati sono disponibili per la lettura
  3. Se la connessione è stata chiusa, ripristinare, o terminato

Vediamo se siamo in grado di discriminare:

  1. È sempre sa se Listen() è stato chiamato prima, quindi non è necessario considerare che la causa, se non si dispone.
  2. Ok, si va per questo.
  3. significa che non si può stare nella chiamata Poll () e la necessità di scoprire che cosa è realmente accaduto. Una possibilità è quella di verificare subito lo stato del socket dopo Poll() restituito.

Conclusione:

  1. non deve essere considerato

  2. e 3. può essere gestita controllando lo stato del socket viene restituito ogni volta true.

Quindi, vorrei andare per (non testato):

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

Altri suggerimenti

Si potrebbe utilizzare la proprietà presa disponibile. Esso restituisce come è disponibile per leggere molti dati.

Trovato qualcosa in classe NetworkStream. NetworkStream.DataAvailable restituisce true se i dati sono disponibili per la lettura. Oggetto della NetworkStream viene restituito a che fare con TcpListener e TcpClient. Questo è un livello di astrazione superiore presa.

ho trovato alcun modo per venire da presa a NetworkStream. Un NetworkStream utilizza una presa ed è la rappresentazione di un flusso presa. Ma non so che cosa il NetworkStream sta facendo lì con la presa.

È possibile utilizzare il select) chiamata di sistema (sul manico sottostante.

È possibile utilizzare il metodo al posto del sondaggio Scegli () (). In realtà quando si cerca in Socket.Poll con ILSpy (strumento riflettore) del codice interno sta chiamando selezionare sulla presa.

Inoltre, chiamando Poll () in un ciclo stretto aumenterà l'allocazione della memoria, come fa un nuovo IntPtr [] per ogni chiamata. La chiamata Select () consente di riutilizzare le matrici invece di allocare nuovi sotto il cofano.

vero se Ascoltare è stato chiamato e di una connessione è in attesa; -o- vero se i dati sono disponibili per la lettura; -o- vero se la connessione è stata chiusa, resettare, o terminato; in caso contrario, restituisce false.

Capisco che si desidera verificare se la seconda opzione è quella di tornare vero? Dopo aver controllato se il sondaggio restituisce true, è possibile controllare se la connessione è aperta, questo significa; Non collegamento, chiusa, ripristinare o terminato.

Se è aperto, allora è la seconda opzione restituisce true.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top