Я пишу, запускаю, отлаживаю 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" убил мой сервер, он закрыл все эти сокеты и немедленно завершил работу.Это не помогло