Сброс соединения TCP
От: darkserj  
Дата: 31.07.13 13:07
Оценка:
Приветствую.
Возник вопрос, как мне сбросить соединения еще не прошедшие accept?

Есть пул потоков которые обрабатывают поступившие соединения.
Если все потоки заняты хочется закрыть соединение, чтобы клиент обратился к следующему по списку серверу.
Сейчас приходится получать дескриптор после accept и закрывать его close.
Есть ли более правильные решения? Платформа Linux и MacOS X.
Re: Сброс соединения TCP
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 31.07.13 13:12
Оценка: 4 (1)
Здравствуйте, darkserj, Вы писали:

D>Приветствую.

D>Возник вопрос, как мне сбросить соединения еще не прошедшие accept?

D>Есть пул потоков которые обрабатывают поступившие соединения.

D>Если все потоки заняты хочется закрыть соединение, чтобы клиент обратился к следующему по списку серверу.
D>Сейчас приходится получать дескриптор после accept и закрывать его close.
D>Есть ли более правильные решения? Платформа Linux и MacOS X.

Старые звери вроде sendmail закрывают в этом случае слушающий сокет.
Но если проблема кратковременная, надо просто не делать accept(), а подождать освобождения треда. Потому что в этом случае клиенту лучше подождать, чем нарываться на немедленный отказ.
При более длительном (для каждой цели длительность считается по-своему) — закрывать таки слушающий сокет.

В SysV интерфейсе (TLI/XTI) есть вызов закрыть без принятия, но в BSD sockets (склонированном и в Linux) такого нет.
The God is real, unless declared integer.
Re[2]: Сброс соединения TCP
От: darkserj  
Дата: 31.07.13 13:42
Оценка:
Здравствуйте, netch80, Вы писали:

D>>Приветствую.

D>>Возник вопрос, как мне сбросить соединения еще не прошедшие accept?

N>Старые звери вроде sendmail закрывают в этом случае слушающий сокет.

N>Но если проблема кратковременная, надо просто не делать accept(), а подождать освобождения треда. Потому что в этом случае клиенту лучше подождать, чем нарываться на немедленный отказ.
N>При более длительном (для каждой цели длительность считается по-своему) — закрывать таки слушающий сокет.

N>В SysV интерфейсе (TLI/XTI) есть вызов закрыть без принятия, но в BSD sockets (склонированном и в Linux) такого нет.

Спасибо.
Про закрытие слушающего сокета я знаю, но что-то меня в этом смущает, есть ли какие подводные камни?

В теории, можно послать RST в ответ на соединение, но как бы это сделать?
Re[3]: Сброс соединения TCP
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 31.07.13 13:48
Оценка: 2 (1)
Здравствуйте, darkserj, Вы писали:

D>Спасибо.

D>Про закрытие слушающего сокета я знаю, но что-то меня в этом смущает, есть ли какие подводные камни?

Ну разве что кто-то захватит этот порт. Но можно рядом создать неслушающий в коннекте (обязательно).

D>В теории, можно послать RST в ответ на соединение, но как бы это сделать?


Через iptables. Дайте приложению через sudo ${script} такие права.
The God is real, unless declared integer.
Re: Сброс соединения TCP
От: Nikolay_Ch Россия  
Дата: 31.07.13 19:30
Оценка:
Здравствуйте, darkserj, Вы писали:

D>Приветствую.

D>Возник вопрос, как мне сбросить соединения еще не прошедшие accept?

D>Есть пул потоков которые обрабатывают поступившие соединения.

D>Если все потоки заняты хочется закрыть соединение, чтобы клиент обратился к следующему по списку серверу.
D>Сейчас приходится получать дескриптор после accept и закрывать его close.
D>Есть ли более правильные решения? Платформа Linux и MacOS X.
а если установить длину очереди в listen?
Re[2]: Сброс соединения TCP
От: darkserj  
Дата: 05.08.13 16:06
Оценка:
Здравствуйте, Nikolay_Ch, Вы писали:
D>>Есть пул потоков которые обрабатывают поступившие соединения.
D>>Если все потоки заняты хочется закрыть соединение, чтобы клиент обратился к следующему по списку серверу.
D>>Сейчас приходится получать дескриптор после accept и закрывать его close.
D>>Есть ли более правильные решения? Платформа Linux и MacOS X.
N_C>а если установить длину очереди в listen?
Для некоторых запросов, увеличивается время ответа, хотя они могли бы быть дропнуты и обработаны следующим сервером.
Re: Сброс соединения TCP
От: Ivan83 http://www.netlab.linkpc.net/
Дата: 08.08.13 22:24
Оценка:
Здравствуйте, darkserj, Вы писали:

D>Возник вопрос, как мне сбросить соединения еще не прошедшие accept?

Не получай дескриптор, не вызывай accept() и всё.
http://www.netlab.linkpc.net/
Re[2]: Сброс соединения TCP
От: Nikolay_Ch Россия  
Дата: 08.08.13 22:34
Оценка:
Здравствуйте, Ivan83, Вы писали:

I>Не получай дескриптор, не вызывай accept() и всё.

Таймаут соединения достаточно большой. Клиент все это время будет ждать, хотя мог-бы присоединиться к соседнему серверу... А именно этого, насколько я понимаю, хотел избежать автор вопроса...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.