2015-01-29 3 views
0

Я пытаюсь закрыть сокет на окнах из 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, может ли это быть причиной?

+1

Возможно, включая полный рабочий код, который показывает проблему. – Richard

+0

К сожалению, я не могу, я могу ответить на любой вопрос, но не могу вставить код, извините за это –

+0

Вы пытались использовать 'l_onoff = 0'? Или с 'SO_DONTLINGER'? – ElderBug

ответ

1

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

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

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

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

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

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

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

+0

Весь код, который использует этот сокет, довольно большой, я могу публиковать только те интересующие нас детали :) –

+0

Пожалуйста, разместите свой код * в своем вопросе. * Вы сами можете убедиться, что он полностью и совершенно неразборчив, когда выложили в комментариях. Я даже не собираюсь даже пытаться расшифровать этот беспорядок. – EJP

+0

извините за это. да, я не уверен, но я думаю, что сверстник не читает данные, возможно, что некоторые данные ретранслируются, но я хочу закрыть это соединение, не ожидая чего-либо. –