[Delphi, WinSocket] Как узнать локальный адрес или нет?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by RedFern.89, 3 Apr 2011.

  1. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    575
    Likes Received:
    48
    Reputations:
    0
    На тему клиент-сервер. К серверу подключился клиент, И нужно узнать, локальный адрес или нет. Как это сделать?
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Локальный адрес или нет для кого?

    Вообще всё просто делается:
    1) для уже установленного коннекта (сокета) делай
    getsockname и getpeername
    2) getpeername - вернет IP и PORT удаленного сокета. Для сервера это порт и адрес клиента, для клиента это адрес и порт сервера.
    getsockname - для локального сокета.
    3) Если всё находится на одном и томже компе, то IP должны совпадать
     
  3. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Мне кажется он имеет ввиду является подключенный клиент с локальной сети, не?
     
  4. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    575
    Likes Received:
    48
    Reputations:
    0
    Jingo Bo, да
     
  5. Steam[777]

    Steam[777] Elder - Старейшина

    Joined:
    27 Sep 2010
    Messages:
    296
    Likes Received:
    43
    Reputations:
    25
    К частным адресам относятся следующие диапазоны (подробности – в документе RFC1918):
    10.0.0.0 – 10.255.255.255 (сеть класса A, маска 255.0.0.0)
    172.16.0.0 – 172.31.255.255 (16 сетей класса B, маска 255.255.0.0)
    192.168.0.0 – 192.168.255.255 (256 сетей класса C, маска 255.255.255.0)

    Если админ локальной сети дружит со стандартами (читай - с головой), твоя сеть будет иметь один из указанных адресов. Если адрес вне этого диапазона - клиент пришёл "снаружи"
     
    #5 Steam[777], 4 Apr 2011
    Last edited: 4 Apr 2011
  6. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Ну да, если клиентское и серверное приложение пишешь ты, то можно сделать так :
    1. При подключении нового клиента - посылаем несколька Broadcast UDP датаграмм.
    2. Со стороны клиента при получении такой диаграммы - отвечаем серверу уже TCP сообщение(через уже открытый канал).

    Фишка в том что Broadcast датаграммы можно отправлять только по локальной сети, только отправляй не одну, а несколько, причем как можно короче по размеру.
     
  7. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 Jingo Bo dj мноних локалках такая вешь запрещена. Потому что если каждый ком будет отправлять широковещательные запросы, то при 500 компах в локалке, сеть будет ужасно тупить, по этому часто дропают все широковещательные, кроме тех которые нужны для поддержки работы сети.

    Вообще тогда проще можно сделать. Тупо вбить IP и маску локалки и сравнивать с ней.
    ну или автоматом брать из таблици маршрутизации