Сокеты. WinSock. Определение адреса клиента на клиенте.

Тема в разделе "WASM.BEGINNERS", создана пользователем Span, 9 янв 2007.

  1. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Здравствуйте.

    Есть задача: определить локальный IP адрес клиента (private/public), вызывающего connect().
    На транспортном уровне - TCP. Работаю из Win32.

    Сейчас умею определять IP машины, который можно увидеть через ipconfig. А нужно - тот, который будет видеть сервер.

    Т.е. у меня private IP 192.168.XXX.YYY.

    Сервер находится в интернет. При коннекте на него, серверу, понятное дело, пофиг на мой адрес в своей сетке.
    Так вот, как определить IP, который видит сервер при коннекте на него???

    П.С. Надеюсь понятно изъясняюсь, тяжко все это после праздниов.
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    Смотри то что возвращает accept
    Там в структуре будет айпи того , кто соединился.

    Второй способ бредовый но рабочий, связан с функциями getpeername и тп

    (Надеюсь, я правильно понял эти "предложения")
     
  3. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Дык accept() - он на стороне сервера работает. А надо на стороне клиента этот адрес посмотреть.
    За getpeername - thx. Сейчас посмотрю.
     
  4. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    Когда клиент соединяется адерс сервера он знает - перед вызовом connect()
    Вот адрес сервера удаленный знаете. А свой - он будет в hostent (там массив айпи адресов, которые привязаны к вашей машине)
     
  5. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Вот я и беру адрес из hostent. И вижу там 192.168.xxx.yyy. А на сервере, естественно, другой адрес.

    Сейчас кода нет под рукой, позже скину кусок, может у меня просто руки не оттуда.
     
  6. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    мне, честно говоря, вообще не приходило в голову, что это возможно сделать средствами TCP/IP
    по-моему, только через службы сервера (всякие whois там любят показывать клиенту его адрес итд)
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    Nouzui
    Дело в том что он свой айпи узнать хочет, как я понял. Но внешний - которые ему пров выдает..
     
  8. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    TermoSINteZ
    я об этом и говорю: узнать внутренний - не проблема, а вот существование внешнего ип должно быть для клиента абсолютно прозрачно, поэтому единственный способ - получить IP внутри поля данных пакета, например, в ответе веб сервера
    имхо
    вот такого, например: http://www.who.is/
     
  9. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Абсолютно верно.
     
  10. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    Nouzui
    Зависит от того, как выдается этот айпи. Если это ВПН или прокси, то конечно так не узнать. Но вроде есть методы, правда сразу не скажу.. (может даже ошибаюсь)
    А если это айпи присваеваемый например как WAN интерфейс (PPPoE и тп) то тут как из структур можно извлечь то, что нужно.
     
  11. Mescalito

    Mescalito New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2005
    Сообщения:
    78
    Адрес:
    Харьков
    Если клиент работает через какой-нибудь NAT например то узнать свой внешний адрес на транспортном уровне он не сможет просто по определению NAT. Единственный выход - поднятся выше
     
  12. Span

    Span New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2006
    Сообщения:
    134
    Выше??

    Это на прикладной чтоль?
     
  13. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    бог ты мой..
    Span
    формируешь http запрос, отправляешь его на http://www.who.is/ (или другой, более надежный сервис)
    читаешь ответ
    парсишь полученную страничку
    выцепаешь оттуда свой ip
    как тольк сервер накроется или изменит дизайн своей странички, все это сразу перестанет работать
    если есть нормалный способ, то я об этом даже не догадываюсь