Чем закрыть сокет процессора
Я запускаю определенную программу на linux, которая иногда аварийно завершается. Если после этого быстро открыть ее, она слушает сокет 49201, а не 49200, как в первый раз. netstat показывает, что 49200 находится в состоянии TIME_WAIT.
Есть ли программа, которую можно запустить, чтобы немедленно заставить этот сокет выйти из состояния TIME_WAIT?
Ответ 1
/etc/init.d/networking restart
Transmission Control Protocol (TCP) разработан как двунаправленный, упорядоченный и надежный протокол передачи данных между двумя конечными точками (программами). В данном контексте термин « надежный » означает, что он будет повторно передавать пакеты, если они будут потеряны в процессе передачи. TCP гарантирует надежность, посылая обратно пакеты подтверждения (ACK) для одного или нескольких пакетов, полученных от аналога.
То же самое относится и к управляющим сигналам, таким как запрос/ответ на завершение. RFC793 определяет состояние TIME-WAIT следующим образом:
TIME-WAIT — представляет собой ожидание достаточного времени, чтобы убедиться, что удаленный TCP получил подтверждение своего запроса на разрыв соединения.
TCP — это протокол двунаправленной связи, поэтому, когда соединение установлено, нет разницы между клиентом и сервером. Кроме того, любой из них может объявить о выходе из соединения, и для полного закрытия установленного TCP-соединения оба соединения должны договориться о закрытии.
Назовем первого, кто объявляет о прекращении соединения, активным замыкающим, а другого — пассивным замыкающим. Когда активный доводчик посылает FIN, состояние переходит в FIN-WAIT-1. Затем он получает ACK на отправленный FIN, и состояние переходит в FIN-WAIT-2. Получив FIN также от пассивного доводчика, активный доводчик отправляет ACK на FIN, и состояние переходит в TIME-WAIT. Если пассивный доводчик не получил ACK на второй FIN, он повторно передает FIN-пакет.
RFC793 устанавливает TIME-OUT , равным удвоенному времени жизни максимального сегмента, или 2MSL. Поскольку MSL, максимальное время, в течение которого пакет может блуждать по и нтернету, установлено в 2 минуты, 2MSL равно 4 минутам. Поскольку нет ACK на ACK, активный досылатель не может сделать ничего, кроме как подождать 4 минуты, если он правильно придерживается протокола TCP/IP, на случай, если пассивный отправитель не получил ACK на свой FIN (теоретически).
В реальности пропущенные пакеты, вероятно, редки и очень редки, если все это происходит в пределах локальной сети или в пределах одной машины.
Чтобы ответить на вопрос дословно : « Как принудительно закрыть сокет в TIME_WAIT? » , я буду придерживаться своего первоначального ответа:
/etc/init.d/networking restart
Практически говоря, я бы запрограммировал его так, чтобы он игнорировал состояние TIME-WAIT, используя опцию SO_REUSEADDR. Что именно делает SO_REUSEADDR?
Эта опция сокета сообщает ядру, что , даже если этот порт занят (находится в состоянии TIME_WAIT), все равно используйте его повторно. Если он занят, но в другом состоянии, вы все равно получите ошибку « адрес уже используется » . Это полезно, если ваш сервер был выключен, а затем сразу же перезапущен, а сокеты на его порту все еще активны. Вы должны знать, что , если поступят неожиданные данные, это может запутать ваш сервер, хотя такое маловероятно.
17.7. Ошибки сокетов
17.7. Ошибки сокетов Некоторые значения errno встречаются только при работе с сокетами. Ниже приведен список специфических ошибок сокетов вместе с краткими их описаниями. EADDRINUSE Запрашиваемый адрес уже используется и не может быть переприсвоен. EADDRNOTAVAIL Запрашивается
5.5.7. Пары сокетов
5.5.7. Пары сокетов Как было показано выше, функция pipe() создает два дескриптора для входного и выходного концов канала. Возможности каналов ограничены, так как с файловыми дескрипторами должны работать связанные процессы и данные через канал передаются только в одном
Доброго времени суток! У меня следующая проблема:
Пишу игру, в которой идёт передача данных по сети. Использую класс Socket. Так вот, если в первые разы запускать программу - всё в порядке, но потом вылетает ошибка. Дело в том, что при закрытии видимо сокет не закрывается конкретно и поэтому при следующем запуске пишет, что сокет уже используется. Итак, мне нужно при открытии программы проверять, свободен ли сокет. Это у меня получилось, а вот как теперь закрыть активные сокеты? Не могу разобраться.
Благодарен всем кто откликнется.
Как найти все активные radioButton
Как сделать проверку radioButton, какие есть активные и дать каждому radioButton свое имя?
Как свернуть все активные окна, если сама программа в свернутом виде?
здравствуйте есть вот такой вот код сворачивает все активные окна все работает но как сделать так.
Можно ли отключить все активные сессии на данный момент в ДБ?
Собственно вопрос в теме. Если сказать по другому: хочу по кнопке отослать всем кто счас в БД.
Спасибо за ответ, но это не совсем то. Создать подключение и передавать данные у меня получается. А вот при закрытии программы видимо не всегда закрывается socket. Я пробовал на Form_Closing вешать socket.Close() и socket.Disconnect() - не помогает. При следующем запуске программы выдаёт exception, что данный сокет уже открыт.
Вот строчка, где выдаёт ошибку:
А пишет следующее: "Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт)"
В общем, мне надо при подключении проверять, есть ли какие-то открытия сокет-соединения и глушить их. Проверку я делаю так:
Здесь всё отрабатывает. А вот как теперь закрыть сокет? Я пробовал после "MessageBox.Show("Сокет открыт");" писать socket.Close() - та же ошибка.
а вы вызываете TcpListener.Stop() ?
только что проверил у себя с TcpListener , система все сама закрывает.
Так, начнем с того, что система сама (. ) закрывает связанные сокеты после закрытия приложения.
Два вопроса:
1) Какой порт Вы используете? Может он бывает занят другим приложением типа браузера.
2) А Вы всё закрыли на сервере?
Проблему удалось решить?
как закрыть соединение программно, а не закрытием полностью всего приложения.
Мало. У меня такая же проблема. (только с UdpClient)
Код вроде-бы нормальный, Close() вызывается еще и в событии OnClose
Код выполняется внутри приложения-движка Unity3D (редактора).
Иногда (не всегда, но в каких-то редких не отслеживаемых случаях) начинает возникать ошибка, что порт 5555 занят.
Открываю монитор ресурсов: порт 5555 используется приложением Unity3D.exe (только строчка с этим портом почему-то показывается серым). Закрываю Unity - порт освобождается, запускаю класс (последовательно вызываются методы Connect и Close ) запускаю класс опять - не запускается, потому что порт по-прежнему используется приложением Unity3D.
Помогает перезагрузка, после нее обычно класс можно много раз запускать\закрывать.
Но в некоторых случаях стабильно возникает проблема с не закрывающимся портом.
Возможно это проблема приложения Unity3d, только мне от этого не понятнее. (в ранних версиях приложения такой проблемы не было).
Отличие Web сокетов от сокетов в Boost Asio
Здравствуйте, Кто нибудь может пожалуйста подсказать, есть ли различие между WebSocket и.
Закрытие дочернего окна вызывает закрытие программы
Здравствуйте! Не могу никак разобраться, как сделать так, чтобы дочернее окно при его закрытии не.
Вызов модальной формы из модальной, нужно:закрытие последней и не закрытие первой.
1. Вызываю модальную форму из главной формы (немодальной). 2. Вызываю другую модальную форму из.
Тестирование сокетов
Сделал клиент и сервер на сокетах. Возник вопрос: как протестировать их в "боевых" условиях.
1. Пожалуйста, используйте теги для вставки кода, в таком виде Ваш код мало читаем.
2. В статье (и "оригинальном" перловом скрипте) речь о udp, но раз у Вас хоть как-то работает. Дайте ссылку на полное описание протокола. Например, схема коннект на url для меня выглядит странно. Да и наличие кип-аливэ запроса как-бы намекает. Вдруг сокет вообще не надо закрывать?
3. select() на запись в listen сокет - жуть, в таком виде Вам select() вообще не нужен.
4. обертка вокруг read() выглядит странно. Например EWOULDBLOCK Вы там никогда не получите, результат меньше 0 ф-я тоже не вернет, ну и читать по байту как-то странно.
5. Не ленитесь, сделайте send() одним куском, будет чуть быстрей.
6. Делайте shutdown()+close() хотя я уже говорил, это выглядит не типично для подобных протоколов.
А тормоза cisco. ну так, она тупо ждет пока Ваш сервер пережует 1 запрос (ведь сейчас как правило, одна html страничка это десятки url), запросы накапливаются и в конце концов, часть запросов отваливается по таймауту. Логично?
Отправка сокетов
Пытаюсь через сокеты просто "открыть" страничку на локальном сайте (запущен через Apache). При.
Перехват сокетов
Набросайте, пожалуйста, программу, которая умеет перехватывать сокеты, направленные от клиента.
15.4. Функции сокетов
15.4. Функции сокетов Функции сокетов применяются к доменным сокетам Unix с учетом некоторых особенностей и ограничений. Далее мы перечисляем требования POSIX, указывая, где они применимы. Отметим, что на сегодняшний день не все реализации соответствуют этим
Ответ 4
Альтернативным решением может быть использование надежного прокси-сервера или программы переадресации портов, которая прослушивает порт 49200, а затем переадресует соединение на один из нескольких экземпляров вашей менее надежной программы, использующих разные порты. Например, HAPROXY.
Кстати, порт, через который вы подключаетесь, довольно высокий. Вы можете попробовать использовать неиспользуемый порт чуть выше диапазона 0-1024. Ваша система с меньшей вероятностью будет использовать более низкий номер порта в качестве него.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Конечно, про то как через epoll() осуществлять взаимодействие с сокетами прийдется долго читать и разбираться, но зато сможешь спокойно отловить все ситуации.
в libevent/boost::asio callback тебе придет. но можное еще конечно руками с epoll/select/poll посношаться
в libevent/boost::asio callback тебе придет. но можное еще конечно руками с epoll/select/poll посношаться
Неоссилятор boost::asio думает, что в процессе изучения этого самого boost::asio тоже придется посношаться.
//Но ты можешь дать хороший пример, опровергающий это утверждение.
посмотри страничку Отта — там всё написано простым языком
А можно в виде ссылки?
> как создать функцию-обработчик закрытия сокета противоположной стороной
проверяй возвращаемое значение и errno. или уточни вопрос.
UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking API
By W. Richard Stevens, Bill Fenner, Andrew M. Rudoff
> проверяй возвращаемое значение и errno. или уточни вопрос.
Кстати, да. Можно регулярно слать пакеты - и проверять - жива ли «та» сторона.
P.S. Мне нужно с минимальными затратами (на development) закрывать сокеты (на сервере), если противоположная сторона (клиент) его закрыла.
> если противоположная сторона (клиент) его закрыла.
противоположная сторона может закрыть сокет либо на чтение, либо на запись, либо на чтение-запись. помни об этом ;)
т.е. то, что тебе read() вернул ошибку ещё не значит, что ты не можешь туда писать.
противоположная сторона может закрыть сокет либо на чтение, либо на запись, либо на чтение-запись. помни об этом ;)
Это интересная фича, но на практике ей редко пользуются. Да и вроде никаким особым образом такую ситуацию обрабатывать не надо. Просто закрыл свой сокет, когда получил информацию о разрыве соединения, и всё.
> Это интересная фича, но на практике ей редко пользуются.
да, в «приветмир»ах ей практически не пользуются, спорить не буду ;)
> Да и вроде никаким особым образом такую ситуацию обрабатывать не надо. Просто закрыл свой сокет, когда получил информацию о разрыве соединения, и всё.
ну да, конечно :) представь себе гипотетический сервер БД, с запросами типа SQL. сервер в одном потоке читает от клиента все запросы и парсит их, в другом (других) — выполняет по мере возможности. вот отдал клиент серверу запрос и закрыл сокет на запись (но не на чтение — ему нужен результат выполнения). сервер при чтении следующей команды (или на (е)полле) получает ошибку — сокет закрыт. если эту ситуацию не обрабатывать, т.е. просто закрыть сокет со своей стороны и, возможно, забить на очередь запросов от этого клиента, то это будет немножко не то, чего ожидает клиент ;)
вот отдал клиент серверу запрос и закрыл сокет на запись
Не, ну если протокол взаимодействия предполагает работу с полузакрытыми соединениями, тогда да.
А какой смысл полузакрытых соединений в контексте данного примера? Ведь можно закрыть сокет после получения ответа.
> А какой смысл полузакрытых соединений в контексте данного примера?
оптимизация же. сервер может такой сокет выбросить из (е)полла.
оптимизация же. сервер может такой сокет выбросить из (е)полла.
Он может и так выкинуть сокет из epoll, если поймет, что следующих запросов не будет. Такие вещи проще решать на прикладном уровне. Это более гибко и понятно.
> оптимизация же. сервер может такой сокет выбросить из (е)полла.
Рановато, ему же ещё ответ впихивать клиенту и не факт, что он влезет в буфер с первого раза. В данном примере никакого облегчения в логике сервера с помощью shutdown не получится.
> Он может и так выкинуть сокет из epoll, если поймет, что следующих запросов не будет.
через libastral, да? ;)
> Такие вещи проще решать на прикладном уровне. Это более гибко и понятно.
свой лисапед написать проще и понятнее, чем использовать готовую возможность протокола? молодец, чо :)
> Рановато, ему же ещё ответ впихивать клиенту и не факт, что он влезет в буфер с первого раза.
свой лисапед написать проще и понятнее, чем использовать готовую возможность протокола? молодец, чо :)
Надо завести один бит в управляющем байте пакета для индикации, что больше запросов не будет. Это реализовать намного проще, чем предусматривать все варианты развития событий при возможном неполном закрытии соединения.
> Надо завести один бит в управляющем байте пакета для индикации, что больше запросов не будет. Это реализовать намного проще, чем предусматривать все варианты развития событий при возможном неполном закрытии соединения.
слушай, как ты будешь реализовывать свой протокол обмена — твои личные половые проблемы. но это не отменяет того факта, что данная возможность есть и используется другими разработчиками.
Когда работа с сокетом закончена, его следует закрыть, вызвав функцию closesocket(SOCKET s). Сначала сервер закрывает сокет, созданный функцией accept, а не прослушивающий сокет, созданный с помощью функции socket. Сервер должен закрывать прослушивающий сокет только тогда, когда завершает работу или прекращает принимать клиентские запросы соединения. Даже если вы работаете с сокетом как с дескриптором типа HANDLE и используете функции ReadFile и WriteFile, уничтожить сокет одним только вызовом функции CloseHandle вам не удастся; для этого следует использовать функцию closesocket.
28.2. Создание символьных сокетов
28.2. Создание символьных сокетов При создании символьных сокетов выполняются следующие шаги:1. Символьный сокет создается функцией socket со вторым аргументом SOCK_RAW. Третий аргумент (протокол) обычно ненулевой. Например, для создания символьного сокета IPv4 следует написать:int
7.5. Общие параметры сокетов
7.5. Общие параметры сокетов Мы начнем с обсуждения общих параметров сокетов. Эти параметры не зависят от протокола (то есть они управляются не зависящим от протокола кодом внутри ядра, а не отдельным модулем протокола, такого как IPv4), но некоторые из них применяются только
7.8. Параметры сокетов IPv6
7.8. Параметры сокетов IPv6 Эти параметры сокетов обрабатываются IPv6 и имеют аргумент level, равный IPPROTO_IPV6. Мы отложим обсуждение пяти параметров сокетов многоадресной передачи до раздела 21.6. Отметим, что многие из этих параметров используют вспомогательные данные с функцией
3.2. Структуры адреса сокетов
3.2. Структуры адреса сокетов Большинство функций сокетов используют в качестве аргумента указатель на структуру адреса сокета. Каждый набор протоколов определяет свою собственную структуру адреса сокетов. Имена этих структур начинаются с sockaddr_ и заканчиваются
Ответ 3
Другой вариант — использовать опцию SO_LINGER с тайм-аутом 0. Таким образом, при закрытии сокета он будет закрыт принудительно, посылая RST, а не переходя в режим закрытия FIN/ACK. Это позволит избежать состояния TIME_WAIT и может быть более подходящим для некоторых случаев.
27.3. Программирование сокетов
27.3. Программирование сокетов 27.3.1. Что такое сокет? Сокет — это двунаправленный канал между двумя компьютерами в сети, который обеспечивает конечную точку соединения. «Двунаправленный» означает, что данный могут передаваться в двух направлениях — от клиента к серверу и
7.9. Параметры сокетов TCP
7.9. Параметры сокетов TCP Для сокетов TCP предусмотрены два специальных параметра. Для них необходимо указывать level
7.6. Параметры сокетов IPv4
Программный интерфейс сокетов
Программный интерфейс сокетов Вы уже познакомились с интерфейсом сокетов при обсуждении реализации межпроцессного взаимодействия в BSD UNIX. Поскольку сетевая поддержка впервые была разработана именно для BSD UNIX, интерфейс сокетов и сегодня является весьма
Ответ 2
Насколько я знаю, нет способа принудительно закрыть сокет, кроме написания лучшего обработчика сигналов в вашей программе, но есть файл /proc, который управляет временем тайм - аута. Файл имеет следующий вид:
/proc/sys/net/ipv4/tcp_tw_recycle
и вы можете установить тайм-аут в 1 секунду, выполнив следующее:
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
Однако на этой странице содержится предупреждение о возможных проблемах с надежностью при установке этой переменной.
Существует также соответствующий файл:
/proc/sys/net/ipv4/tcp_tw_reuse
который контролирует возможность повторного использования сокетов TIME_WAIT (предположительно без какого-либо тайм - аута).
Кстати, документация ядра предупреждает вас не изменять ни одно из этих значений без "совета/просьбы технических экспертов". Программа должна была быть написана для попытки привязки к порту 49200 и последующего увеличения на 1, если порт уже используется. Поэтому, если у вас есть контроль над исходным кодом, вы можете изменить это поведение, чтобы подождать несколько секунд и повторить попытку на том же порту, вместо инкремента.
Пара сокетов
Пара сокетов Пара сокетов (socket pair) для соединения TCP — это кортеж (группа взаимосвязанных элементов данных или записей) из четырех элементов, определяющий две конечных точки соединения: локальный IP-адрес, локальный порт TCP, удаленный IP-адрес и удаленный порт TCP. В SCRIPT
7.10. Параметры сокетов SCTP
7.10. Параметры сокетов SCTP Относительно большое количество параметров, определенных для сокетов SCTP (17 на момент написания этой книги), дают возможность разработчику приложения более точно контролировать его поведение. Параметр level для сокетов SCTP должен принимать значение
7.4. Состояния сокетов
7.4. Состояния сокетов Для некоторых параметров сокетов время их установки или получения зависит некоторым образом от состояния сокета. Далее мы обсудим эту зависимость для тех параметров, к которым это относится.Следующие параметры сокетов наследуются присоединенным
5.5.1. Концепции сокетов
5.5.1. Концепции сокетов При создании сокета необходимо задать три параметра, тип взаимодействия, пространство имен и протокол.Тип взаимодействия определяет способ интерпретации передаваемых данных и число абонентов. Данные, посылаемые через сокет, формируются в блоки,
Читайте также: