Je suis sûr que vous avez vu la connexion " la connexion a été réinitialisé le message" / em> "affiché lorsque vous essayez de parcourir les pages Web. (Le texte provient de Firefox, d'autres navigateurs diffèrent.) P>
Je dois générer ce message / erreur / condition à la demande, pour tester les solutions de contournement. P>
Alors, comment générer cette condition par programme? ( CAVEZIERS ET CONDITIONS: P>
Il ne peut pas être un bloc IP Général. Le client de test doit toujours être capable de voir le serveur de test lorsqu'il ne pas déclencher la condition. P> li>
Idéalement, il serait fait au niveau de l'application Web (Python, PHP, Coldfusion, JavaScript, etc.). L'accès aux routeurs est problématique. L'accès à Apache config est une douleur. P> li>
idéalement, il serait déclenché en récupérant une page Web spécifique. p> li>
bonus s'il travaille sur un hôte Web standard et commercial. P> li>
ol>
Envoi J'ai une solution qui fonctionne sur une machine locale, il est maintenant nécessaire de le faire fonctionner sur un hôte distant. P> Comment générer un TCP RST code> à partir de PHP - ou l'une des autres langues Web-app? Strike>) P>
Mise à jour: H2>
RST code> ne suffit pas pour causer cette condition. Voir ma réponse partielle ci-dessous. P>
3 Réponses :
Je pense que vous devez fermer la prise de basse niveau assez brusquement. Vous ne pourrez pas le faire de JavaScript. Pour les autres langues, vous aurez généralement besoin d'obtenir une poignée sur l'objet de socket sous-jacent et de fermer () elle manuellement. P>
Je doute également que vous puissiez le faire via Apache car c'est Apache et non votre application qui détient la prise. Au mieux, vos efforts sont susceptibles de générer une erreur HTTP 500 qui n'est pas ce que vous êtes après. P>
Je recommanderais de faire cela via une prise personnalisée via CLI comme messages avec le processus Apache pourrait être en désordre: Ceci générera l'erreur souhaitée dans Firefox car la connexion est fermée avant la lecture . P> Si vous vous sentez incroyablement audacieux, vous pouvez joindre cela dans un script Web, mais je ne voudrais même pas essayer que vous n'êtes pas propriétaire de la boîte et que vous sachiez ce que vous faites admin sage. P> p>
Cela ne convient pas à un déploiement hébergé en raison de l'utilisation de getmypid () code> et
exécuté () code> (plus la tentative de tuer le processus !!!). En outre, est
Kill code> une commande valide sur une machine Windows? mais b>, ce script fonctionne sur ma machine de développement locale avec les notes suivantes: (1) La limite de temps est la mieux définie sur une valeur irrégulière, 300 est nombreuses. (2) Les 3 dernières lignes ne sont pas nécessaires. Il semble que la connexion soit réinitialisée automatiquement, juste après les tentatives de Firefox pour parcourir le port - aucune tuerie sur pid n'est nécessaire. Je n'ai pas encore de ceci travaillant sur notre hôte de dev.
Administrateur refuse judicieusement de permettre ceci sur les hôtes distants. Cette approche effectue également pire que le schéma non risqué de la définition SO_LINGER code>.
Ce script a bien fonctionné assez pour tester notre solution de contournement de connexion de connexion. C'est donc une réponse partielle. p>
Si une personne propose la solution complète qui fonctionne sur un hôte distant, je ferai une marquer volontiers comme la réponse. P>
Le script suivant fonctionne à chaque fois lors de la course à pied et testé sur la même machine. Mais lors de la course sur un hôte distant, le navigateur reçoit les 3 derniers paquets: P>
<?php $time_lim = 30; $listen_port = 8081; echo '<h1>Testing generation of a connection reset condition.</h1> <p><a target="_blank" href="http://' .$_SERVER["HTTP_HOST"]. ':' .$listen_port. '/"> Click here to load page that gets reset. You have ' . $time_lim . ' seconds.</a> </p> ' ; flush (); ?> <?php //-- Warning! If the script blocks, below, this is not counted against the time limit. set_time_limit ($time_lim); $socket = @socket_create_listen ($listen_port); if (!$socket) { print "Failed to create socket!\n"; exit; } socket_set_nonblock ($socket); //-- Needed, or else script executes until a client interacts with the socket. while (true) { //-- Use @ to suppress warnings. Exception handling didn't work. $client = @socket_accept ($socket); if ($client) break; } /*--- If l_onoff is non-zero and l_linger is zero, all the unsent data will be discarded and RST (reset) is sent to the peer in the case of a connection- oriented socket. */ $linger = array ('l_linger' => 0, 'l_onoff' => 1); socket_set_option ($socket, SOL_SOCKET, SO_LINGER, $linger); //--- If we just close, the Browser gets the RST flag but fails silently (completely blank). socket_close ($socket); echo "<p>Done.</p>"; ?>
Cela ressemble à la connexion TCP a été envoyé une TVR. Je me demande si vous pouvez obtenir php à exécuter () une commande qui le fera. Demandez peut-être une recherche de connexions appartenant à son PID (
getmypid () code>) puis tuez-les. Stackoverflow.com/Questtions/3139204/... Suggère en.wikipedia.org/wiki/tcpkill
@Fanis: Oui, envoyer un
RST code> devrait le faire. Merci pour les suggestions; enquêter ...
Oups, envoi
RST code> est pas b> suffisant. Voir Mise à jour q et réponse partielle.