Как же все таки получить правильный локальный адрес!
От: Asker_ Россия  
Дата: 31.08.06 17:15
Оценка:
Вот ведь не ожидал. Но пришлось столкнуться со старой проблемой.


Требуется определить правильный локальный IP адрес, для того чтобы передать его на клиента. То есть адрес клиента я знаю, и формирую некий файл. кторый каким-то там образом попадает на клиента, и в этом файле надо указать свой адрес, для того что бы клиент приконектился ко мне уже по TCP.

Сделал как советовали на RSDN'е — то есть воспользовался GetBestInterface...

Но тут скандал, клиент звонит и говорит, что ничего не работает... Выясняется, что у него на сервере установлено несколько адаптеров (это не беда!) НО вот ведь ещё что! и у каждого ещё не по одному адресу назначено. А теперь я и думаю, чтож делать, опять также проблема — какой адрес-то выбрать! Или вообще шлюз по умолчанию.

Вот ведь, а советовали то вроде как самые знатоки... Я про вот эту тему — здесь
Автор: Andrew.W Worobow
Дата: 25.04.06
Re: Как же все таки получить правильный локальный адрес!
От: Michael Chelnokov Украина  
Дата: 31.08.06 17:38
Оценка: 2 (1)
Здравствуйте, Asker_, Вы писали:

A_>То есть адрес клиента я знаю, и формирую некий файл. кторый каким-то там образом попадает на клиента


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

(ректальная офтальмология продиктована условиями задачи)
Re[2]: Как же все таки получить правильный локальный адрес!
От: Asker_ Россия  
Дата: 31.08.06 19:31
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

MC>(ректальная офтальмология продиктована условиями задачи)


Интересное предположение, что мне должен быть известен ждущий и открытый TCP порт. И что на моей машине мне должны разрешить это исходящее соедлинение. И что иненно на этот порт должно выполнятся прямое форвардирование. И так далее, и так далее... Ну на мой взгляд слишком много НО и ЕСЛИ.


А нельзя ли придумать какой либо реалистичный способ решения такой простой задачи — "как узнать мой собсвенный адрес на который клиент с данным адресом может законнектится".
Re[3]: Как же все таки получить правильный локальный адрес!
От: Asker_ Россия  
Дата: 31.08.06 20:15
Оценка: 21 (2)
Здравствуйте, Asker_, Вы писали:

A_>Интересное предположение, что мне должен быть известен ждущий и открытый TCP порт.


Беру свои слова обратно. Тормознул — с TCP... Чего-то циклонуло. А вот с UDP и любым, левым портом ( не важно открыт он на клиенте или нет, не важно пустят меня туда или нет ) всё работает... На радостях приведу даже готовый код.


/*
*
* ra - it's dotted inet address, but NOT host name! 
*
*/

char * GetLocalAddress ( char * ra )
{
    WSADATA wsaData;
    
    WSAStartup(MAKEWORD(2,2), &wsaData);
    
    SOCKET ConnectSocket;
    
    ConnectSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    
    sockaddr_in clientService; 
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr( ra );
    clientService.sin_port = htons( 27015 );
    
    connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) );

    sockaddr_in name;
    int s=sizeof(name);

    getsockname ( ConnectSocket, ( sockaddr* ) &name,&s );

    static char ret[4*4], *r;
    
    if ( (r=inet_ntoa ( name.sin_addr )) )
        strcpy (ret, r );
    
    WSACleanup();
    
    return r;
}


Так что спасибо, все таки как иногда бывает не полезна перегруженность знаниями! Это я про тот совет!
Re[3]: Как же все таки получить правильный локальный адрес!
От: Nikolay_Ch Россия  
Дата: 01.09.06 05:08
Оценка:
A_>А нельзя ли придумать какой либо реалистичный способ решения такой простой задачи — "как узнать мой собсвенный адрес на который клиент с данным адресом может законнектится".
Перебираешь все сетевые интерфейсы и все адреса на них. И посылаешь клиенту по-очереди с некоторым интервалом. Клиент-же пытается законнектиться по этим адресам. Часть из них он не получит, часть получит, а на некоторые сможет законнектиться.
Re[4]: Как же все таки получить правильный локальный адрес!
От: Asker_ Россия  
Дата: 01.09.06 06:06
Оценка: -1
Здравствуйте, Nikolay_Ch, Вы писали:

N_C>Перебираешь все сетевые интерфейсы и все адреса на них. И посылаешь клиенту по-очереди с некоторым интервалом. Клиент-же пытается законнектиться по этим адресам. Часть из них он не получит, часть получит, а на некоторые сможет законнектиться.


Ну нифига себе, опять 25! Ну на строчку-же выше дан правильный ответ-совет! И тут опять какую-то фигню советуют! И опять кто-нибудь прочитает и сделает,так как это советует Программист-Преподаватель! Удалите своё сообщение, не правильно ваше предложение, причем не просто не правильно но и вредно...
Re: Как же все таки получить правильный локальный адрес!
От: TarasCo  
Дата: 01.09.06 07:01
Оценка:
Здравствуйте, Asker_, Вы писали:

A_>Сделал как советовали на RSDN'е — то есть воспользовался GetBestInterface...


IMHO — GetBestRoute
Да пребудет с тобою сила
Re[5]: Как же все таки получить правильный локальный адрес!
От: TarasCo  
Дата: 01.09.06 07:03
Оценка:
Здравствуйте, Asker_, Вы писали:

A_>Ну нифига себе, опять 25! Ну на строчку-же выше дан правильный ответ-совет! И тут опять какую-то фигню советуют! И опять кто-нибудь прочитает и сделает,так как это советует Программист-Преподаватель! Удалите своё сообщение, не правильно ваше предложение, причем не просто не правильно но и вредно...


Мне Ваш тон не понравился.
Да пребудет с тобою сила
Re[6]: Как же все таки получить правильный локальный адрес!
От: Asker_ Россия  
Дата: 01.09.06 07:05
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Мне Ваш тон не понравился.


Ну да ладно, что тон... Это всего лищь тон. А вот когда бред гонят, это нормально, да?
Re[5]: Как же все таки получить правильный локальный адрес!
От: Nikolay_Ch Россия  
Дата: 01.09.06 07:05
Оценка:
A_>Ну нифига себе, опять 25! Ну на строчку-же выше дан правильный ответ-совет! И тут опять какую-то фигню советуют! И опять кто-нибудь прочитает и сделает,так как это советует Программист-Преподаватель! Удалите своё сообщение, не правильно ваше предложение, причем не просто не правильно но и вредно...
Мдя... Тот код, который ты привел даст тебе только один адрес первого сетевого интерфейса...
А то, что клиент будет подключен к другому сетевому интерфейсу — ты как будешь проверять?
И еще — для того, чтобы узнать локальный адрес и порт — необязательно создавать соединение...
А вариант, который посоветовал Michael Chelnokov я никоим образом не отметаю, я просто предложил
немного другой подход.

PS
Ма-а-аленький совет — умерить тональность...
Re[7]: Как же все таки получить правильный локальный адрес!
От: Nikolay_Ch Россия  
Дата: 01.09.06 07:08
Оценка:
A_>Ну да ладно, что тон... Это всего лищь тон. А вот когда бред гонят, это нормально, да?
Re[2]: Как же все таки получить правильный локальный адрес!
От: Nikolay_Ch Россия  
Дата: 01.09.06 07:09
Оценка:
TC>IMHO — GetBestRoute
Кстати — да!
Re[2]: Как же все таки получить правильный локальный адрес!
От: Asker_ Россия  
Дата: 01.09.06 07:09
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>IMHO — GetBestRoute


Ну по моему, это всё одно и тоже. Таже старая песня о главном. Зачем так сложно. То что Michael Chelnokov посоветовал, и по чьим следам я даже код привел, это работает, и работает отлично.

Но если вы привидете код, с GetBestRoute, то я думаю это тоже будет полезно.
Re: Как же все таки получить правильный локальный адрес!
От: sokel Россия  
Дата: 01.09.06 07:20
Оценка:
Здравствуйте, Asker_, Вы писали:

A_>Вот ведь не ожидал. Но пришлось столкнуться со старой проблемой.



A_>Требуется определить правильный локальный IP адрес, для того чтобы передать его на клиента. То есть адрес клиента я знаю, и формирую некий файл. кторый каким-то там образом попадает на клиента, и в этом файле надо указать свой адрес, для того что бы клиент приконектился ко мне уже по TCP.


A_>Сделал как советовали на RSDN'е — то есть воспользовался GetBestInterface...


A_>Но тут скандал, клиент звонит и говорит, что ничего не работает... Выясняется, что у него на сервере установлено несколько адаптеров (это не беда!) НО вот ведь ещё что! и у каждого ещё не по одному адресу назначено. А теперь я и думаю, чтож делать, опять также проблема — какой адрес-то выбрать! Или вообще шлюз по умолчанию.


A_>Вот ведь, а советовали то вроде как самые знатоки... Я про вот эту тему — здесь
Автор: Andrew.W Worobow
Дата: 25.04.06


Может лучше его явно на сервере конфигурировать?
Re[6]: Как же все таки получить правильный локальный адрес!
От: Asker_ Россия  
Дата: 01.09.06 07:22
Оценка:
Здравствуйте, Nikolay_Ch, Вы писали:

N_C>Мдя... Тот код, который ты привел даст тебе только один адрес первого сетевого интерфейса...

N_C>А то, что клиент будет подключен к другому сетевому интерфейсу — ты как будешь проверять?

Вот к сожелению, что называется "что и требовалось доказать"! Типа "слышал звон но не знаю где он"; Мне и нужен один, (1) адрес, а не все, и нужен именно тот на который сможет клиент подключится, и именно он и будет получен в рузультате работы этого кода. И не просто получен, а получен именно тот и именно правильный! Еще раз спасибо Michael Chelnokov.!

А что касается того, что клиент подключен к другому интерфейсу, ... Забавно, вот ведь как получается, даже не знаю что и сказать. Сами поймете или все же растолковать подробно.

N_C>И еще — для того, чтобы узнать локальный адрес и порт — необязательно создавать соединение...


Ну давайте ваши более простые варианты.

N_C>Ма-а-аленький совет — умерить тональность...


Да я то умерю. Непроблема, а вот как бы сделать так, чтобы люди сначала обдумывали свои советы, а потом их давали.
Re[7]: Как же все таки получить правильный локальный адрес!
От: Nikolay_Ch Россия  
Дата: 01.09.06 07:45
Оценка:
A_> ...Мне и нужен один, (1) адрес, а не все, и нужен именно тот на который сможет клиент подключится, и именно он и будет получен в рузультате работы этого кода. И не просто получен, а получен именно тот и именно правильный! Еще раз спасибо Michael Chelnokov.!
Код отрабатывает для одного IP-адреса одного сетевого интерфейса и не проверяет рельную доступность с этого адреса и интерфейса до клиента.
Re[8]: Как же все таки получить правильный локальный адрес!
От: Asker_ Россия  
Дата: 01.09.06 08:44
Оценка:
Здравствуйте, Nikolay_Ch, Вы писали:

A_>> ...Мне и нужен один, (1) адрес, а не все, и нужен именно тот на который сможет клиент подключится, и именно он и будет получен в рузультате работы этого кода. И не просто получен, а получен именно тот и именно правильный! Еще раз спасибо Michael Chelnokov.!

N_C>Код отрабатывает для одного IP-адреса одного сетевого интерфейса и не проверяет рельную доступность с этого адреса и интерфейса до клиента.

Ну вот я не поленился и проверил. Вернее перепроверил. И что — все работает правильно.

А детали такие — у меня два сетевых адаптера :

Первый с адресами
192.168.0.11 и 10.10.0.11
Втророй с адресами
<некий реальный адрес> и 192.168.1.1


Вот что возвращает моя функция

GetLocalAddress("192.168.0.99") -> 192.168.0.11
GetLocalAddress("192.168.0.1") -> 192.168.0.11
GetLocalAddress("10.10.0.1" ) -> 10.10.0.11
GetLocalAddress(<некий адрес в интернете>) -> <мой реальный адрес>
GetLocalAddress("192.168.1.99") -> 192.168.1.1
GetLocalAddress("192.168.1.9") -> 192.168.1.1



Причем адреса "192.168.0.99" и "192.168.1.99" несуществуют в сети!
а "192.168.0.1" и "192.168.1.9" Реально есть и это другие компы.

Остальные проверяемые адреса тоже есть.


Так что опять, мимо!
Re[3]: Как же все таки получить правильный локальный адрес!
От: Michael Chelnokov Украина  
Дата: 01.09.06 12:15
Оценка:
Здравствуйте, Asker_, Вы писали:

A_>Интересное предположение, что мне должен быть известен ждущий и открытый TCP порт.


Вообще-то я предполагал что если ты можешь записать на компьютер "клиента" файл, то на нем что-то таки открыто...
Re[2]: Как же все таки получить правильный локальный адрес!
От: Michael Chelnokov Украина  
Дата: 01.09.06 12:34
Оценка:
Здравствуйте, sokel, Вы писали:

S>Может лучше его явно на сервере конфигурировать?


Да, это правильно. По правилам клиент обязан знать адрес сервера, а сервер и подавно должен знать свой адрес.
Любой способ передачи на клиента чего-либо без иннициативы последнего — кривой по определению.
Однако мир не идеален и иногда приходится что-то делать через задницу. Я не знаю почему изначальна был выбран именно такой метод, когда сервер записывает клиенту свой адрес. Видимо были какие-то очень веские причины. Так как мы их не знаем, то принимаем условие как должное.
Да, еще. Есть такое понятие как zero-administration. Если какой-либо параметр конфигурации может быть получен каким-либо способом, то его лучше получить, чем явно задавать. По данному конкретному случаю — видимо адреса клиентов прописываются на сервере (по каким-либо соображениям). Поэтому адрес сервера совсем необязательно прописывать явно, он может быть разным для разных клиентов и может быть получен из маршрута к конкретному клиенту. Принцип zero-administration в действии. При переносе сервера на другие адреса даже не надо менять его конфигурацию
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.