Skip to content

Instantly share code, notes, and snippets.

@outsinre
Last active November 28, 2025 08:14
Show Gist options
  • Select an option

  • Save outsinre/69b3ff0a5c35360f29448e5643ca1bad to your computer and use it in GitHub Desktop.

Select an option

Save outsinre/69b3ff0a5c35360f29448e5643ca1bad to your computer and use it in GitHub Desktop.
Reuse cosocket after close
-- watch ss -npeat dst "23.193.170.59" or dst "172.217.31.164"
-- ll /proc/<pid>/fd
local inspect = require("inspect")
-- create cosocket
local sock = ngx.socket.tcp()
sock:settimeouts(1000, 15000, 15000)
ngx.say("sock new = ", inspect(sock))
-- create kernel socket
local ok, err = sock:connect("23.193.170.59", 80)
if not ok then
ngx.say("connection err: ", err)
end
ngx.say("sock to 23.193.170.59:80 = ", inspect(sock))
ngx.say("sleeping 10s ...")
ngx.sleep(10)
-- create a new kernel socket
ok, err = sock:connect("172.217.31.164", 443)
if not ok then
ngx.say("connection err: ", err)
end
ngx.say("sock to 172.217.31.164:443 = ", inspect(sock))
ngx.say("sleeping 30s ...")
ngx.sleep(30)
-- only discard kernel socket
ngx.say("closing connection ...")
sock:close()
-- cosocket remains
ngx.say("sock after close = ", inspect(sock))
ngx.say("sleeping 60s ...")
ngx.sleep(60)
@outsinre
Copy link
Author

  1. close() only discard kernel socket (TCP connection) but preserve cosocket itself.
  2. setkeepalive preserve kernel socket (TCP connection) as well.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment