1 votes

Fermeture forcée des connexions clients par le serveur Remoting au milieu d'un appel distant

J'ai un système composé d'un serveur acceptant les appels de remoting des clients avec TCP comme couche de transport sous-jacente. Normalement, cela fonctionne comme un charme, mais si j'augmente le nombre de clients, le serveur commence à fermer les connexions TCP de manière aléatoire au milieu des appels. Tous les appels ne sont pas interrompus de cette façon.

C'est un comportement vraiment inattendu... Je ne reçois aucune exception du côté serveur, seulement l'exception du côté client :

System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host

Server stack trace: 
   ved System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   ved System.Runtime.Remoting.Channels.SocketStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   ved System.Runtime.Remoting.Channels.SocketHandler.ReadFromSocket(Byte[] buffer, Int32 offset, Int32 count)
   ved System.Runtime.Remoting.Channels.SocketHandler.Read(Byte[] buffer, Int32 offset, Int32 count)
   ved System.Runtime.Remoting.Channels.SocketHandler.ReadAndMatchFourBytes(Byte[] buffer)
   ved System.Runtime.Remoting.Channels.Tcp.TcpSocketHandler.ReadAndMatchPreamble()
   ved System.Runtime.Remoting.Channels.Tcp.TcpSocketHandler.ReadVersionAndOperation(UInt16& operation)
   ved System.Runtime.Remoting.Channels.Tcp.TcpClientSocketHandler.ReadHeaders()
   ved System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream)
   ved System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg)

Exception rethrown at [0]: 
   ved System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   ved System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   ved EBH.GuG.AgentKit.Transports.RemotingAgentHostEndPoint.SyncInvoke(Agent a, Int32 port)

0voto

Spence Points 15057

Fonctionnez-vous sous Windows XP/2000/98 ?

Si c'est le cas, XP dispose d'un mécanisme d'étranglement intégré de 10 sockets sortants (pour vous empêcher d'utiliser des machines de bureau comme serveurs afin de vous obliger à payer pour Windows Server).

Supplémentaire :

Vous pourriez peut-être réarchitecturer vos appels avec un callback afin qu'ils ne maintiennent pas les sockets ouverts pendant que le travail est effectué, ce qui devrait améliorer votre débit simultané.

0voto

Antony Perkov Points 757

Connaissez-vous bien le matériel réseau entre vos clients et votre serveur ?

Chaque fois que j'ai eu ce genre de problème, il s'est avéré qu'il était dû à une mauvaise configuration du pare-feu, de l'équilibreur de charge, etc.

Si vous configurez un environnement de test avec vos clients et votre serveur connectés au même commutateur, vous devriez être en mesure d'effectuer un test de charge pour déterminer si votre code échoue sans qu'aucun autre matériel réseau ne soit impliqué...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X