Looking into nginx: ignore some requests without proper Host header got me thinking that it's not actually possible to close(2)
a TCP connection without the OS properly terminating the underlying TCP connection by sending an RST
(and/or FIN
) to the other end.
One workaround would be to use something like It turns out, that OpenBSD's tcpdrop(8)
, however, as can be seen from usr.sbin/tcpdrop/tcpdrop.c
on OpenBSD and FreeBSD, it's implemented through a sysctl-based interface, and may have portability issues outside of BSDs. (In fact, it looks like even the sysctl-based implementation may be different enough between OpenBSD and FreeBSD to require a porting layer -- OpenBSD uses the tcp_ident_mapping
structure (which, subsequently, contains two sockaddr_storage
elements, plus some other info), whereas FreeBSD, DragonFly and NetBSD use an array of two sockaddr_storage
elements directly.)tcpdrop
does appear to send the R
packet as per tcpdump(8)
, and can be confirmed by looking at /sys/netinet/tcp_subr.c :: tcp_drop()
, which calls tcp_close()
in the end (and tcp_close()
is confirmed to send RST
elsewhere on SO), so, it appears that it wouldn't even work, either.
If I'm establishing the connection myself through C, is there a way to subsequently drop it without an acknowledgement to the other side, e.g., without initiating RST
?