| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Сети > Выбор интерфейса для исходящего соединения. |
| Автор: F22 2.2.2010, 15:02 |
| Исходные данные: Win XP Sp3. Есть две сетевые карты, подключенные к локальным сетям, через которые есть выход в инет. На первой белый айпи 91.х.х.х, на второй серый айпи 10.х.х.х (выход в инет через NAT). Маршрут по умолчанию для инета настроен на первую. Программа-клиент соединяется с различными серверами в инете. Задача: При падении инета на первой сетевой карте (ошибка соединения) необходимо повторить попытку через вторую. Реализация: Для повторной попытки делаю новый сокет с bind с адресом 10.х.х.х и тут получается проблема, Если сервер в первой локальной сети, то всё работает прекрасно, а если это инетовский сервер, то функция connect проходит нормально, а функции send и recv уже не работают, ошибка 10054 - An existing connection was forcibly closed by the remote host. netstat показывает для этого соединения TIME_WAIT. Наверно какие-то проблемы бинда с натом, а какие непонятно и как их победить? |
| Автор: InvalidProperty 2.2.2010, 17:37 |
| а bind зачем? после того, как заметишь, что коннект рухнул, через некоторое время пытаешься поднять его сново обычной связкой socket / connect, и у тебя все нормально откроется. Только что проверял на своей программе. |
| Автор: F22 2.2.2010, 18:36 | ||
Ну это не интересно: 1. рухнуть может только инет, а локалка работать и для того чтобы программа это поняла надо набрать некоторую статистику, а это время. 2. не работать может только один сервер по причине нарушения маршрута или забанен айпи и и переключать маршрутами ВЕСЬ трафик на второй интерфейс не целесообразно, а переключать только данный сервер - так таблица маршрутизации будет похожа бог знает на что. 3. После переключения на второй интерфейс надо периодически переключаться на первый для проверки, а это пропадание связи. |