Я пытаюсь закрыть сокет на окнах из closesocket(), но для завершения требуется 20 секунд. Сначала я думал, что это было около интервала задерживаться, хотя я ничего не устанавливая с setsockopt по задерживаться, поэтому я добавил такой код:Запуск closesocket() на сокет в окнах занимает 20 секунд
linjer lobj;
lobj.l_onoff = 1;
lobj.l_linger = 0;
sz = sizeof(lobj);
setsockopt(s_, SOL_SOCKET, SO_LINGER, (char *) &lobj, sz);
но это все равно не поможет.
любые идеи? Я просто хочу закрыть соединение, не имеет значения, если он изящный или аборты, просто захотите закрыть его как можно скорее.
P.S. он занимает ровно 20 секунд.
lobj.l_onoff = 1;
lobj.l_linger = 0;
sz = sizeof(lobj);
setsockopt(s_, SOL_SOCKET, SO_LINGER, (char *) &lobj, sz);
lobj.l_onoff = -1;
lobj.l_linger = -1;
getsockopt(s_, SOL_SOCKET, SO_LINGER, (char *) &lobj, &sz);
log << "Option 1:" << lobj.l_linger << ".\n";
log << "Option 2:" << lobj.l_onoff << ".\n";
closesocket(s_);
этот код печатает вариант1 = 0 и option2 = 1, поэтому он действительно устанавливает опцию правильно.
Также, наблюдая за проводами, он отправляет RST в начале полной задержки.
плюс, closesocket() возвращает 0.
P.S. Я установил SO_REUSADDR, может ли это быть причиной?
Возможно, включая полный рабочий код, который показывает проблему. – Richard
К сожалению, я не могу, я могу ответить на любой вопрос, но не могу вставить код, извините за это –
Вы пытались использовать 'l_onoff = 0'? Или с 'SO_DONTLINGER'? – ElderBug