Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.175] |
|
Сообщ.
#1
,
|
|
|
Такая ситуация:
Открываю слушающий TCP сокет на 0.0.0.0 (ANY). Затем делаю DOWN -> UP на один из интерфейсов (меняю IP адрес интерфейса с опусканием и поднятием). После этого сокет оказывается неработоспособным. Приходится переоткрывать сокет. При этом например вебсервер корректно переживает опускание/поднятие интерфейса, т.е. остается рабочим уже на новом адресе. Вопрос: как он это делает и как мне сделать то же самое? (Linux) |
Сообщ.
#2
,
|
|
|
На свете чудеса есть, в сетевом программировании - нет.
Предоставьте код своих Цитата DOWN -> UP на один из интерфейсов (меняю IP адрес интерфейса с опусканием и поднятием). и протокол общения с клиентом. И какими образом вы определяете неработоспособность сокета. |
Сообщ.
#3
,
|
|
|
Цитата HardRock @ При этом например вебсервер корректно переживает опускание/поднятие интерфейса, т.е. остается рабочим уже на новом адресе. Так может он тоже переоткрывает сокет, как только получает ошибку на старом сокете. И слушает на 0.0.0.0, а не на конкретном IP. |
Сообщ.
#4
,
|
|
|
Кстати, сервер никогда не слушает на INADDR_ANY
Он только биндится на универсальный адрес. Ну и немного из лекции: Цитата Функцию bind() обязательно исполнят серверные программы. Чем это объясняется? Для сервера важно "знать" свой собственный обратный адрес – а именно, IP-адрес своей сетевой карты – и порт, на котором будет осуществляться прием заявок на обслуживание, приходящих из сети. Поскольку программист при написании программы может знать только порт, например для Веб-сервера – 80-й, то IP-адреса на каком-то хосте он вообще знать не может. А сетевых интерфейсов на серверном хосте может быть много. Для выхода из положения IP-адрес в структуре адреса сокета может быть задан равным INADDR_ANY или 0 и в том случае, когда хост имеет несколько сетевых интерфейсов. Константа INADDR_ANY называется "универсальным адресом", с помощью которого ядро системы оповещается о необходимости самостоятельного выбора номера сетевого интерфейса. Если в запросе bind() указывается адрес ноль или INADDR_ANY, то в структуру адреса автоматически занесется локальный IP-адрес используемого сетевого интерфейса хоста. Если таких несколько на хосте, то система использует так наз. предпочтительный интерфейс. В ОС Linux, если при вызове bind() было в адресной структуре сокета было указано значение INADDR_ANY, сокет будет ассоциирован со всеми локальными сетевыми интерфейсами. Если в ОС Linux необходимо привязать сокет к конкретному интерфейсу, то следует использовать опцию SO_BINDTODEVICE. |
Сообщ.
#5
,
|
|
|
Цитата HardRock @ Затем делаю DOWN -> UP на один из интерфейсов (меняю IP адрес интерфейса с опусканием и поднятием). После этого сокет оказывается неработоспособным. А в момент DOWN сокет не чувствует ошибки ? Поисследуй. Если "да", то интенесно, какая ошибка (код) возникает. --- Значит, если сможем почуять такую ошибку, тогда можно будет ликвидировать сокет и пытаться создать новый с некоторой периодичностью до достижения успеха. |
Сообщ.
#6
,
|
|
|
Цитата IP-адрес своей сетевой карты |
Сообщ.
#7
,
|
|
|
Цитата HardRock @ Затем делаю DOWN -> UP на один из интерфейсов (меняю IP адрес интерфейса с опусканием и поднятием). После этого сокет оказывается неработоспособным. А ещё какие-то интерфейсы остаются активными в системе? |
Сообщ.
#8
,
|
|
|
Цитата Mr.Delphist @ А ещё какие-то интерфейсы остаются активными в системе? Думаю вопрос останется висеть в воздухе... 5 месяцев прошло... |