2010-09-16 4 views
4

Je suis confus quant à ce qui est «meilleur» à utiliser pour les sockets. L'objet Socket fournit des méthodes Send/Receive (et des équivalents asynchrones), mais permet également de créer un NetworkStream. La seule façon que je l'ai eu de la joie à l'aide Socket.Send est en enveloppant l'appel dans un bloc tel que:Sockets C# et SslStreams

 

using (Stream stream = new NetworkStream(socket)) { 
    socket.Send(...); 
    stream.Flush(); 
} 
 

Lorsque vous utilisez SslStream, si vous envoyez un message sur la prise sous-jacente, il sera être envoyé sur SSL? Dois-je juste utiliser Stream.Write (...) plutôt que les méthodes de socket?

Merci.

Répondre

15

Règles générales:

  • Si vous n'êtes pas en utilisant un NetworkStream, utilisez les méthodes Socket.Send/Socket.Receive.
  • Si vous utilisez un NetworkStream (qui enveloppe le Socket), utilisez les méthodes NetworkStream.Read/Write mais n'appelez pas les méthodes Socket.
  • Si vous encapsulez un NetworkStream dans un SslStream, utilisez les méthodes NetworkStream.Read/Write avant d'appeler AuthenticateAsClient/Server et les méthodes SslStream.Read/Write après.

Après AuthenticateAsClient/Server, votre connexion sera sécurisée par SSL. N'appelez pas alors les méthodes Socket ou NetworkStream: cela va casser le SslStream.

(Il est possible d'ignorer ces règles dans certaines circonstances, mais vous devez alors être très prudent et savoir exactement ce que font Socket, NetworkStream et SslStream sous la hotte.Si vous utilisez toujours l'enveloppe la plus externe, vous êtes sur côté sûr.)

+0

Merci pour cela. Si je ferme ensuite le SslStream à chaque extrémité, est-il possible d'en ouvrir un nouveau sur le même socket? –

+0

@QmunkE: Autant que je sache, non. Une fois que vous avez créé un NetworkStream ou un SslStream, vous l'utilisez jusqu'à la fermeture de la connexion. – dtb