From e7bc76da7388db23c33b03bc26c49e61bdcf02ed Mon Sep 17 00:00:00 2001 From: Vladimir Dubrovin <3proxy@3proxy.ru> Date: Sat, 8 Aug 2026 21:34:15 +0300 Subject: [PATCH] Restore half-close support by default (accidentally switched off in previous fixes) --- man/3proxy.cfg.5 | 13 ++++++++----- src/proxymain.c | 8 ++++---- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/man/3proxy.cfg.5 b/man/3proxy.cfg.5 index b3572e4..76fa4f7 100644 --- a/man/3proxy.cfg.5 +++ b/man/3proxy.cfg.5 @@ -201,11 +201,14 @@ for most traffic. Rebuild with -DWITHSPLICE to make -s available, -s0 disables i explicitly. .br .B -C - (for TCP services) keep the session until both sides close the connection -(TCP half-close). By default a connection closed by any of the sides terminates -the session, buffered data is delivered before the sockets are closed. Half-close -is required for the protocols where one of the sides closes its sending side and -expects the answer, it may cause the sockets to be kept in CLOSE_WAIT state. + (for TCP services) a connection closed by any of the sides terminates the +session, buffered data is delivered before the sockets are closed. By default +the session is kept until both sides close the connection (TCP half-close). +Half-close is required for the protocols where one of the sides closes its +sending side and expects the answer, but it keeps the socket of the side which +has already closed the connection in CLOSE_WAIT state. Use -C to close both +sockets as soon as any of the sides closes the connection, -C1 to request +the default behaviour explicitly. .br (for dnspr) simple, do not use resolver and 3proxy cache, always use external DNS server. .br diff --git a/src/proxymain.c b/src/proxymain.c index 00f841d..ec65ca9 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -329,8 +329,8 @@ int MODULEMAINFUNC (int argc, char** argv){ #endif #ifdef WITHSPLICE " -s Use splice() - no filtering for data, off by default\n" - " -C keep the session until both sides close the connection (TCP half-close),\n" - " by default connection closed by any of the sides terminates the session\n" + " -C connection closed by any of the sides terminates the session, by default\n" + " the session is kept until both sides close it (TCP half-close)\n" #endif "-g(GRACE_TRAFF,GRACE_NUM,GRACE_DELAY) - delay GRACE_DELAY milliseconds before polling if average polling size below GRACE_TRAFF bytes and GRACE_NUM read operations in single directions are detected within 1 second to minimize polling\n" " -fFORMAT logging format (see documentation)\n" @@ -599,7 +599,7 @@ int MODULEMAINFUNC (int argc, char** argv){ sscanf(argv[i]+2, "%d,%d,%d", &srv.gracetraf, &srv.gracenum, &srv.gracedelay); break; case 'C': - srv.halfclose = *(argv[i]+2)? atoi(argv[i]+2) : 1; + srv.halfclose = *(argv[i]+2)? atoi(argv[i]+2) : 0; break; case 's': #ifdef WITHSPLICE @@ -1252,7 +1252,7 @@ void srvinit(struct srvparam * srv, struct clientparam *param){ #ifdef WITHSPLICE srv->usesplice = 0; #endif - srv->halfclose = 0; + srv->halfclose = 1; memset(param, 0, sizeof(struct clientparam)); param->srv = srv; param->version = srv->version;