Вот ведь не ожидал. Но пришлось столкнуться со старой проблемой.
Требуется определить правильный локальный IP адрес, для того чтобы передать его на клиента. То есть адрес клиента я знаю, и формирую некий файл. кторый каким-то там образом попадает на клиента, и в этом файле надо указать свой адрес, для того что бы клиент приконектился ко мне уже по TCP.
Сделал как советовали на RSDN'е — то есть воспользовался GetBestInterface...
Но тут скандал, клиент звонит и говорит, что ничего не работает... Выясняется, что у него на сервере установлено несколько адаптеров (это не беда!) НО вот ведь ещё что! и у каждого ещё не по одному адресу назначено. А теперь я и думаю, чтож делать, опять также проблема — какой адрес-то выбрать! Или вообще шлюз по умолчанию.
Вот ведь, а советовали то вроде как самые знатоки... Я про вот эту тему — здесь
Здравствуйте, Asker_, Вы писали:
A_>То есть адрес клиента я знаю, и формирую некий файл. кторый каким-то там образом попадает на клиента
С этого места подробнее. Если ты знаешь "адрес клиента", не можешь ли ты предварительно сделать на него connect (на любой доступный порт), и узнать какой из локальных IP-адресов смог к клиенту подключиться? По логике этот IP адрес и должен потом использовать клиент...
Здравствуйте, Michael Chelnokov, Вы писали:
MC>(ректальная офтальмология продиктована условиями задачи)
Интересное предположение, что мне должен быть известен ждущий и открытый TCP порт. И что на моей машине мне должны разрешить это исходящее соедлинение. И что иненно на этот порт должно выполнятся прямое форвардирование. И так далее, и так далее... Ну на мой взгляд слишком много НО и ЕСЛИ.
А нельзя ли придумать какой либо реалистичный способ решения такой простой задачи — "как узнать мой собсвенный адрес на который клиент с данным адресом может законнектится".
Re[3]: Как же все таки получить правильный локальный адрес!
Здравствуйте, Asker_, Вы писали:
A_>Интересное предположение, что мне должен быть известен ждущий и открытый TCP порт.
Беру свои слова обратно. Тормознул — с TCP... Чего-то циклонуло. А вот с UDP и любым, левым портом ( не важно открыт он на клиенте или нет, не важно пустят меня туда или нет ) всё работает... На радостях приведу даже готовый код.
A_>А нельзя ли придумать какой либо реалистичный способ решения такой простой задачи — "как узнать мой собсвенный адрес на который клиент с данным адресом может законнектится".
Перебираешь все сетевые интерфейсы и все адреса на них. И посылаешь клиенту по-очереди с некоторым интервалом. Клиент-же пытается законнектиться по этим адресам. Часть из них он не получит, часть получит, а на некоторые сможет законнектиться.
Re[4]: Как же все таки получить правильный локальный адрес!
Здравствуйте, Nikolay_Ch, Вы писали:
N_C>Перебираешь все сетевые интерфейсы и все адреса на них. И посылаешь клиенту по-очереди с некоторым интервалом. Клиент-же пытается законнектиться по этим адресам. Часть из них он не получит, часть получит, а на некоторые сможет законнектиться.
Ну нифига себе, опять 25! Ну на строчку-же выше дан правильный ответ-совет! И тут опять какую-то фигню советуют! И опять кто-нибудь прочитает и сделает,так как это советует Программист-Преподаватель! Удалите своё сообщение, не правильно ваше предложение, причем не просто не правильно но и вредно...
Re: Как же все таки получить правильный локальный адрес!
Здравствуйте, Asker_, Вы писали:
A_>Ну нифига себе, опять 25! Ну на строчку-же выше дан правильный ответ-совет! И тут опять какую-то фигню советуют! И опять кто-нибудь прочитает и сделает,так как это советует Программист-Преподаватель! Удалите своё сообщение, не правильно ваше предложение, причем не просто не правильно но и вредно...
Мне Ваш тон не понравился.
Да пребудет с тобою сила
Re[6]: Как же все таки получить правильный локальный адрес!
A_>Ну нифига себе, опять 25! Ну на строчку-же выше дан правильный ответ-совет! И тут опять какую-то фигню советуют! И опять кто-нибудь прочитает и сделает,так как это советует Программист-Преподаватель! Удалите своё сообщение, не правильно ваше предложение, причем не просто не правильно но и вредно...
Мдя... Тот код, который ты привел даст тебе только один адрес первого сетевого интерфейса...
А то, что клиент будет подключен к другому сетевому интерфейсу — ты как будешь проверять?
И еще — для того, чтобы узнать локальный адрес и порт — необязательно создавать соединение...
А вариант, который посоветовал Michael Chelnokov я никоим образом не отметаю, я просто предложил
немного другой подход.
PS
Ма-а-аленький совет — умерить тональность...
Re[7]: Как же все таки получить правильный локальный адрес!
Здравствуйте, TarasCo, Вы писали:
TC>IMHO — GetBestRoute
Ну по моему, это всё одно и тоже. Таже старая песня о главном. Зачем так сложно. То что Michael Chelnokov посоветовал, и по чьим следам я даже код привел, это работает, и работает отлично.
Но если вы привидете код, с GetBestRoute, то я думаю это тоже будет полезно.
Re: Как же все таки получить правильный локальный адрес!
Здравствуйте, Asker_, Вы писали:
A_>Вот ведь не ожидал. Но пришлось столкнуться со старой проблемой.
A_>Требуется определить правильный локальный IP адрес, для того чтобы передать его на клиента. То есть адрес клиента я знаю, и формирую некий файл. кторый каким-то там образом попадает на клиента, и в этом файле надо указать свой адрес, для того что бы клиент приконектился ко мне уже по TCP.
A_>Сделал как советовали на RSDN'е — то есть воспользовался GetBestInterface...
A_>Но тут скандал, клиент звонит и говорит, что ничего не работает... Выясняется, что у него на сервере установлено несколько адаптеров (это не беда!) НО вот ведь ещё что! и у каждого ещё не по одному адресу назначено. А теперь я и думаю, чтож делать, опять также проблема — какой адрес-то выбрать! Или вообще шлюз по умолчанию.
A_>Вот ведь, а советовали то вроде как самые знатоки... Я про вот эту тему — здесь
Здравствуйте, Nikolay_Ch, Вы писали:
N_C>Мдя... Тот код, который ты привел даст тебе только один адрес первого сетевого интерфейса... N_C>А то, что клиент будет подключен к другому сетевому интерфейсу — ты как будешь проверять?
Вот к сожелению, что называется "что и требовалось доказать"! Типа "слышал звон но не знаю где он"; Мне и нужен один, (1) адрес, а не все, и нужен именно тот на который сможет клиент подключится, и именно он и будет получен в рузультате работы этого кода. И не просто получен, а получен именно тот и именно правильный! Еще раз спасибо Michael Chelnokov.!
А что касается того, что клиент подключен к другому интерфейсу, ... Забавно, вот ведь как получается, даже не знаю что и сказать. Сами поймете или все же растолковать подробно.
N_C>И еще — для того, чтобы узнать локальный адрес и порт — необязательно создавать соединение...
Ну давайте ваши более простые варианты.
N_C>Ма-а-аленький совет — умерить тональность...
Да я то умерю. Непроблема, а вот как бы сделать так, чтобы люди сначала обдумывали свои советы, а потом их давали.
Re[7]: Как же все таки получить правильный локальный адрес!
A_> ...Мне и нужен один, (1) адрес, а не все, и нужен именно тот на который сможет клиент подключится, и именно он и будет получен в рузультате работы этого кода. И не просто получен, а получен именно тот и именно правильный! Еще раз спасибо Michael Chelnokov.!
Код отрабатывает для одного IP-адреса одного сетевого интерфейса и не проверяет рельную доступность с этого адреса и интерфейса до клиента.
Re[8]: Как же все таки получить правильный локальный адрес!
Здравствуйте, Nikolay_Ch, Вы писали:
A_>> ...Мне и нужен один, (1) адрес, а не все, и нужен именно тот на который сможет клиент подключится, и именно он и будет получен в рузультате работы этого кода. И не просто получен, а получен именно тот и именно правильный! Еще раз спасибо Michael Chelnokov.! N_C>Код отрабатывает для одного IP-адреса одного сетевого интерфейса и не проверяет рельную доступность с этого адреса и интерфейса до клиента.
Ну вот я не поленился и проверил. Вернее перепроверил. И что — все работает правильно.
А детали такие — у меня два сетевых адаптера :
Первый с адресами
192.168.0.11 и 10.10.0.11
Втророй с адресами
<некий реальный адрес> и 192.168.1.1
Здравствуйте, sokel, Вы писали:
S>Может лучше его явно на сервере конфигурировать?
Да, это правильно. По правилам клиент обязан знать адрес сервера, а сервер и подавно должен знать свой адрес.
Любой способ передачи на клиента чего-либо без иннициативы последнего — кривой по определению.
Однако мир не идеален и иногда приходится что-то делать через задницу. Я не знаю почему изначальна был выбран именно такой метод, когда сервер записывает клиенту свой адрес. Видимо были какие-то очень веские причины. Так как мы их не знаем, то принимаем условие как должное.
Да, еще. Есть такое понятие как zero-administration. Если какой-либо параметр конфигурации может быть получен каким-либо способом, то его лучше получить, чем явно задавать. По данному конкретному случаю — видимо адреса клиентов прописываются на сервере (по каким-либо соображениям). Поэтому адрес сервера совсем необязательно прописывать явно, он может быть разным для разных клиентов и может быть получен из маршрута к конкретному клиенту. Принцип zero-administration в действии. При переносе сервера на другие адреса даже не надо менять его конфигурацию