FIN_WAIT_2 из моего кода TCP запрещает открывать сокет - PullRequest
0 голосов
/ 03 апреля 2011

Я пишу, запускаю, отлаживаю TCP-сервер во FreeBSD, к которому подключаются мои клиенты.Когда сервер выходит из строя или выходит из строя несколько неблагодарно, часто у меня возникают проблемы, когда я не могу восстановить сервер из-за сбоя моего вызова bind ().Конечно, когда это происходит, я могу найти следующее в netstat -n:

Active Internet connections
Proto Recv-Q Send-Q  Local Address          Foreign Address       (state)
tcp4       0      0 192.168.2.xxx.12345    xx.yy.zz.ww.54201      FIN_WAIT_2

Это довольно раздражает, когда я сижу здесь минуту или 2 или 3, пока это не прояснится.Я старался изо всех сил, чтобы избежать этого:

if((socketId = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) ...

// Set socket to nonblocking.  If this is < 0 there was a failure
if(fcntl(socketId, F_SETFL, O_NONBLOCK) < 0) ...


// Linger settings
struct linger so_linger;
so_linger.l_onoff = 1; // Turn linger option TRUE!
so_linger.l_linger = 0; // And inform to DO NOT LINGER


if(setsockopt(socketId, SOL_SOCKET, SO_LINGER, &so_linger, sizeof(so_linger)) < 0) ...

Итак, почему я получаю затяжное поведение?Это на FreeBSD, но у меня была та же проблема с Linux, прежде чем я перенес свой код сюда.Я попытался вставить код, чтобы, когда я "control-c" убил мой сервер, он закрыл все эти сокеты и немедленно завершил работу.Это не помогло

Ответы [ 2 ]

2 голосов
/ 03 апреля 2011

Попробуйте установить параметр сокета SO_REUSEADDR.

SO_REUSEADDR указывает, что правила, используемые при проверке адресов, передаваемых в вызове bind (2), должны разрешать повторное использование локальных адресов.

AIUI, O / S обычно не позволяет вам bind, если на этом порте остается висящий сокет, и этот вызов должен сообщить O / S, что это разрешено.

0 голосов
/ 09 апреля 2011

Вы также можете взглянуть на sysctls:

  • net.inet.tcp.fast_finwait2_recycle
  • net.inet.tcp.finwait2_timeout

установка recycle = 1 и время ожидания до чего-то вменяемого (5k мс, ваш пробег может отличаться) очень помогли на одном из моих боксов ..

HTH:)

-jamie

...