вызов 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);

но это все равно не помогает.

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

Постскриптум это занимает ровно 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.

Постскриптум Я установил SO_REUSADDR, это может быть причиной?

0

Решение

Если вы не можете разместить код, вы не можете задать вопрос здесь. Это правила.

Однако единственный способ closesocket() может занять любое измеримое время, если:

  • есть много ожидающих исходящих данных, и
  • вы установили положительное время ожидания SO_LINGER.

Вы можете получить задержку только в 20 секунд, установив положительное время ожидания SO_LINGER> = 20 секунд. а также с большим количеством ожидающих исходящих данных а также вероятно, сверстник, который не читает.

Если вы оставили SO_LINGER строго один, что вам следует, или установите его в false, или в true с нулевым таймаутом, closesocket() является асинхронным и немедленно возвращается, и в последнем случае вы бы также сбросили соединение.

следовательно либо вы не сделали то, что заявили, либо ваши наблюдения ошибочны. Возможно, это финал send() который блокирует.

Было бы интересно узнать, closesocket() Вызов вернул -1, и если да, то каково было значение ошибки.

1

Другие решения


По вопросам рекламы [email protected]