Ho un'applicazione che utilizza SslStream
per inviare e ricevere dati con il proprio frammento di lunghezza fissa. Il flusso è creato avvolgendo il NetworkStream
tornato da TcpClient.GetStream()
in questo modo:Quale livello di sicurezza del thread posso aspettarmi da System.Net.Security.SslStream?
var client = new TcpClient();
client.Connect(host, port);
var sslStream = new SslStream(client.GetStream(), false, callback, null);
sslStream.AuthenticateAsClient(hostname);
Poiché il protocollo è completamente asincrona ("messaggi" incorniciati arrivano a volte arbitrarie e il cliente può inviare loro, a volte arbitrarie), I genererebbe normalmente un thread responsabile per il blocco su NetworkStream.Read()
e in caso contrario assicurerà che vi sia un solo thread che chiama NetworkStream.Write(...)
in qualsiasi momento.
La sezione Remarks per NetworkStream
dice:
lettura e scrittura possono essere eseguite simultaneamente una un'istanza della classe NetworkStream senza necessità di sincronizzazione. Finché c'è un thread univoco per le operazioni di scrittura e un thread univoco per le operazioni di lettura, non ci sarà alcuna interferenza tra i thread di lettura e scrittura e non è richiesta alcuna sincronizzazione.
Tuttavia, la sezione MSDN documentation "thread safe" per SslStream
dice:
statici pubblici (in Visual Basic) di questo tipo sono thread-safe . Non è garantito che tutti i membri di istanza siano protetti da thread .
Perché SslStream
e NetworkStream
non sono nella stessa gerarchia di classe, ho assunto (forse erroneamente) che il commento in NetworkStream
non si applicano a SslStream
.
è l'approccio migliore per la sicurezza filo per avvolgere semplicemente SslStream.BeginRead
/SslStream.EndRead
e SslStream.BeginWrite
/SslStream.EndWrite
con qualcosa di simile?
Dettaglio minuscolo: il blocco su _stream funzionerà ma è consigliabile creare e utilizzare un oggetto separato per questo scopo. –
@HenkHolterman Applausi per il consiglio; Ho aggiornato il codice. –
FWIW: Il [SafeSslStream] (https://github.com/smarkets/IronSmarkets/blob/master/IronSmarkets/Sockets/SafeSslStream.cs) in questione è per [IronSmarkets] (https://github.com/smarkets/IronSmarkets). –