2017-09-17 5 views
1

J'ai un proxy de socket écrit en Python qui, lorsqu'il reçoit un RST d'une paire d'homologues communicants, ferme la connexion aux deux homologues en laissant les sockets être récupérés. Il en résulte que l'autre homologue voit un FIN plutôt qu'un RST. Cela signifie que le proxy traduit efficacement RST en FIN, ce qui n'est pas idéal selon moi.Comment réinitialiser une socket TCP en Python?

J'ai trouvé que dans Linux, il est possible de reset a TCP connnection en appelant connecter avec une adresse de la famille AF_UNSPEC. Mais je n'ai pas trouvé un moyen de le faire à partir d'un programme Python.

Comment puis-je connect à une adresse AF_UNSPEC en Python?

Ce que j'ai essayé jusqu'à présent

J'ai essayé de regarder la sortie help pour la méthode connect pertinente et trouvé ceci:

Help on built-in function connect: 

connect(...) 
    connect(address) 

    Connect the socket to a remote address. For IP sockets, the address 
    is a pair (host, port). 

Malheureusement, cela ne me dit pas ce que l'argument address doit être dans le but de construire une adresse AF_UNSPEC.

J'ai essayé d'envelopper le fd socket d'origine dans un nouvel objet socket avec la famille AF_UNSPEC comme ceci:

socket.fromfd(s.fileno(), socket.AF_UNSPEC, 0) 

L'objet résultant produire le même texte d'aide et toute tentative d'appel connect sur l'objet socket nouvellement construit résultats dans

socket.error: getsockaddrarg: bad family 

il ressemble à l'aide socket.fromfd est probablement pas la réponse à ma question.

Répondre

0

Vous pouvez essayer d'utiliser l'option prise SO_LINGER (setsockopt) avec le temps de Linger à 0. close sur socket avec SO_LINGER set avec 0 secondes de temps prolongées entraînera la TVD au lieu de FIN.

+0

J'ai testé 'c.setsockopt (socket.SOL_IP, socket.SO_LINGER, 0)' et cela n'a pas fonctionné. La connexion s'est encore fermée avec 'FIN' pas' RST' comme je le voulais. – kasperd