8
votes

Comment abandonner une prise en C #

J'essaie d'abandonner une connexion à la prise de sorte que le client à l'autre extrémité obtiendra un "logiciel wsaeconnaborted (10053) a provoqué l'abandon de la connexion". Message d'erreur lorsqu'il interroge la connexion.

Fermer () et Shutdown () déconnectera gracieusement. Je ne veux pas d'une déconnexion gracieuse. Je veux faire un abandon pour que le client détecte quelque chose a vraiment mal tourné.

merci,

Edit: Je codage d'un serveur et je souhaite avorter les sockets pour connecter des clients


3 commentaires

Je ne sais pas comment faire ce que vous demandez, mais il semble que le client aurait des attentes sur ce qu'il va être via la connexion à la prise. Si le serveur transmet une valeur qui n'a pas de sens pour que le client s'arrête, il n'aurait pas le même effet que d'avorter le socket? Par exemple, le client attend la valeur INT, Server envoie une chaîne puis se ferme. Juste une pensée.


Je codifie un serveur et je souhaite que le serveur abandonne la connexion si le client envoie des données qui ne répondent pas aux spécifications du protocole.


Dupliqué possible de . Cela étant, vous ne pouvez pas le simuler, car il provient de la pile TCP dans des conditions de défaillance réseau.


7 Réponses :


1
votes

Et si vous tuez le processus, et / ou redémarrez la machine, et / ou débranchez le câble Ethernet, sans appeler ferme () et / ou arrêt ()?


3 commentaires

est-ce que tu plaisantes? Il veut clairement que le programme d'envoyer Econnaborted lorsqu'une erreur se produit. nécessitant qu'il écrase physiquement le lien réseau / processus défait complètement le but.


Je voulais dire, tuer le processus Autre à la Autre fin de la connexion. Il veut Ce programme à recevoir Econnaborted à partir de sa pile TCP locale, qui (je pense) se produit si la connexion est abrité (par exemple, si le pair distant disparaît).


Je suis d'accord avec Chris. Vous ne pouvez pas avoir le serveur envoyer Econnaborted. Ce n'est que lorsque le client verra les acks manqués pour les données qu'il envoie recevra-t-elle Econnaborted sur le prochain appel d'envoi.



-1
votes

Essayez d'appeler Remoend () ou endreceive () en fonction de la situation immédiatement suivie d'un dispositif ()


0 commentaires

0
votes

Je ne pense pas qu'il soit possible d'obtenir le comportement que vous souhaitez avec la mise en œuvre de la prise .NET autrement que d'avoir le client Envoyer Intermittent Ward-Alives. J'ai essayé toutes sortes de choses pour obtenir le comportement que vous avez décrit et avez fini par mettre en œuvre des messages conservés. Si les appels de sévère fermer (), la prise du client obtiendra une erreur d'abandon de la connexion, la prochaine fois qu'il tente d'envoyer des données.


0 commentaires


-1
votes

Vous pouvez essayer de coder toutes les prises secondaires dans un autre fil et tuez-la lorsque vous souhaitez bloquer les connexions.


1 commentaires

Cependant, cela n'aura pas l'effet souhaité. S'il vous plaît ne postez pas de simple devingework ici.



2
votes

Les détails sous-jacents, y compris lorsqu'il est en fait approprié d'abandonner de force une connexion sont décrits en détail ici ( https: // Stackoverflow .COM / A / A / 13088864/1280848 ).

La manière C # de faire c'est: xxx

c'est-à-dire, utilisez SO_LINGER avec time_wait = 0


0 commentaires

0
votes

Abandonner de force une connexion que vous pouvez faire:

socket.Close(timeout: 0)


0 commentaires