Вызов closesocket() для сокета в windows занимает 20 секунд
Я пытаюсь закрыть сокет на окна из closesocket(), но это занимает 20 секунд, чтобы завершить. сначала я думал, что это был интервал задержки, хотя я ничего не устанавливал с помощью setsockopt с помощью linger, поэтому я добавил такой код:
linjer lobj;
lobj.l_onoff = 1;
lobj.l_linger = 0;
sz = sizeof(lobj);
setsockopt(s_, SOL_SOCKET, SO_LINGER, (char *) &lobj, sz);
но это все равно не помогает.
есть идеи? Я просто хочу закрыть соединение, не важно, изящно ли это или аборт, просто хочу закрыть его как можно скорее.
PS это занимает ровно 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_);
этот код выводит option1 = 0 и option2 = 1, поэтому он действительно правильно устанавливает option.
Также, наблюдая от wireshark, он отправляет RST в начале всей задержки.
плюс, closesocket() возвращает 0.
PS Я установил SO_REUSADDR, это может быть причиной?
1 ответ
Если вы не можете разместить код, вы не можете задать вопрос здесь. Это правила.
Однако единственный способ closesocket()
может занять любое измеримое время, если:
- есть много ожидающих исходящих данных, и
- вы установили положительное время ожидания SO_LINGER.
Вы можете получить задержку только в 20 секунд, установив положительное время ожидания SO_LINGER>= 20 секунд и имея много ожидающих исходящих данных и, вероятно, одноранговый узел, который не читает.
Если вы оставили SO_LINGER строго один, что вам следует, или установите его в false, или в true с нулевым тайм-аутом, closesocket()
является асинхронным и немедленно возвращается, и в последнем случае вы бы также сбросили соединение.
Следовательно, либо вы не сделали того, что заявили, либо ваши наблюдения ошибочны. Возможно, это финал send()
который блокирует.
Было бы интересно узнать, closesocket()
Вызов вернул -1, и если да, то каково было значение ошибки.