На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Сокет после down / up
      Такая ситуация:
      Открываю слушающий TCP сокет на 0.0.0.0 (ANY).

      Затем делаю DOWN -> UP на один из интерфейсов (меняю IP адрес интерфейса с опусканием и поднятием). После этого сокет оказывается неработоспособным. Приходится переоткрывать сокет.
      При этом например вебсервер корректно переживает опускание/поднятие интерфейса, т.е. остается рабочим уже на новом адресе.

      Вопрос: как он это делает и как мне сделать то же самое?

      (Linux)
        На свете чудеса есть, в сетевом программировании - нет.
        Предоставьте код своих
        Цитата
        DOWN -> UP на один из интерфейсов (меняю IP адрес интерфейса с опусканием и поднятием).

        и протокол общения с клиентом.
        И какими образом вы определяете неработоспособность сокета.
          Цитата HardRock @
          При этом например вебсервер корректно переживает опускание/поднятие интерфейса, т.е. остается рабочим уже на новом адресе.

          Так может он тоже переоткрывает сокет, как только получает ошибку на старом сокете. И слушает на 0.0.0.0, а не на конкретном IP.
            Кстати, сервер никогда не слушает на INADDR_ANY
            Он только биндится на универсальный адрес.
            Ну и немного из лекции:
            Цитата
            Функцию bind() обязательно исполнят серверные программы. Чем это объясняется?
            Для сервера важно "знать" свой собственный обратный адрес – а именно, IP-адрес своей сетевой карты – и порт, на котором будет осуществляться прием заявок на обслуживание, приходящих из сети. Поскольку программист при написании программы может знать только порт, например для Веб-сервера – 80-й, то IP-адреса на каком-то хосте он вообще знать не может. А сетевых интерфейсов на серверном хосте может быть много.
            Для выхода из положения IP-адрес в структуре адреса сокета может быть задан равным INADDR_ANY или 0 и в том случае, когда хост имеет несколько сетевых интерфейсов. Константа INADDR_ANY называется "универсальным адресом", с помощью которого ядро системы оповещается о необходимости самостоятельного выбора номера сетевого интерфейса. Если в запросе bind() указывается адрес ноль или INADDR_ANY, то в структуру адреса автоматически занесется локальный IP-адрес используемого сетевого интерфейса хоста. Если таких несколько на хосте, то система использует так наз. предпочтительный интерфейс.
            В ОС Linux, если при вызове bind() было в адресной структуре сокета было указано значение INADDR_ANY, сокет будет ассоциирован со всеми локальными сетевыми интерфейсами. Если в ОС Linux необходимо привязать сокет к конкретному интерфейсу, то следует использовать опцию SO_BINDTODEVICE.
            Сообщение отредактировано: Oleg2004 -
              Цитата HardRock @
              Затем делаю DOWN -> UP на один из интерфейсов (меняю IP адрес интерфейса с опусканием и поднятием). После этого сокет оказывается неработоспособным.

              А в момент DOWN сокет не чувствует ошибки ?
              Поисследуй.
              Если "да", то интенесно, какая ошибка (код) возникает.
              ---
              Значит, если сможем почуять такую ошибку, тогда можно
              будет ликвидировать сокет и пытаться создать новый
              с некоторой периодичностью до достижения успеха.
                Цитата
                IP-адрес своей сетевой карты

                :wall:
                  Цитата HardRock @
                  Затем делаю DOWN -> UP на один из интерфейсов (меняю IP адрес интерфейса с опусканием и поднятием). После этого сокет оказывается неработоспособным.

                  А ещё какие-то интерфейсы остаются активными в системе?
                    Цитата Mr.Delphist @

                    А ещё какие-то интерфейсы остаются активными в системе?

                    Думаю вопрос останется висеть в воздухе... :)
                    5 месяцев прошло... :yes:
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0245 ]   [ 16 queries used ]   [ Generated: 28.03.24, 16:08 GMT ]