別件でNginxのソースをgdbでデバッグしながら見てたらlingering_closeがなんたらというパスを見つけたのでせっかくなので調べてみた。lingeringは余韻という意味でクライアント/サーバモデルのシステムがあったとしてサーバ側がアクティブクローズになるケースでサーバはwrite(2)した直後にclose(2)やshutdown(2)をするとwrite(2)のデータがクライアントに届いていないみたいなケースがある。これはwrite(2)はローカルのソケットバッファーにデータを書いたら処理が戻るために起こる。以下のようなサーバを書いてみる。
import socket import struct sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(("127.0.0.1", 8080)) sock.listen(10) while True: client,address = sock.accept() print("[*] Connected!! [ Source : {}]".format(address)) data = client.recv(1024) print("[*] Received Data : {}".format(data)) client.send(b"a"*1024) client.close() print("close!!")