Der zugrunde liegende Verbindung Wunsch kann
import tornado.ioloop
import tornado.web
from tornado.gen import coroutine
class MainHandler(tornado.web.RequestHandler):
@coroutine
def get(self):
self.request.connection.close()
if __name__ == "__main__":
application = tornado.web.Application([
(r"/", MainHandler),
])
application.listen(8888)
tornado.ioloop.IOLoop.current().start()
und den Test explizit geschlossen werden, mit curl:
curl http://localhost:8888/ -v
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8888 (#0)
> GET/HTTP/1.1
> Host: localhost:8888
> User-Agent: curl/7.47.0
> Accept: */*
>
* Empty reply from server
* Connection #0 to host localhost left intact
curl: (52) Empty reply from server
Der obige Code schließt Zusammenhang mit FIN
-flow und lässt die Antwort leer. Wenn Sie die Verbindung mit Reset - RST
trennen müssen, können Sie es erzwingen. Setzen Sie einfach SO_LINGER
für den Socket der Verbindung. Sie können die API als öffentlich betrachten, da es keine _
gibt, aber ... es ist eine Art internes Zeug (implementierungsabhängig) von Tornado.
import socket
import struct
import tornado.ioloop
import tornado.web
from tornado.gen import coroutine
class MainHandler(tornado.web.RequestHandler):
@coroutine
def get(self):
s = self.request.connection.stream.socket
l_onoff = 1
l_linger = 0
s.setsockopt(
socket.SOL_SOCKET, socket.SO_LINGER,
struct.pack('ii', l_onoff, l_linger)
)
self.request.connection.close()
if __name__ == "__main__":
application = tornado.web.Application([
(r"/", MainHandler),
])
application.listen(8888)
tornado.ioloop.IOLoop.current().start()