Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];

Вниз

TIdUDPServer. Как узнать адрес на какой интерфейс пришел пакет.   Найти похожие ветки 

 
CLX   (2006-05-23 14:48) [0]

Имею такую проблему.
Delphi 7, стандартный Indy 9. Есть обычный TIdUDPSevrer.
На машине может быть установлено несколько сетевых интерфейсов. Которые могут быть подключены или отключены во время работы программы.
При получении пакета (UDPServerRead)  мне необходиммо узнать на какой сетевой адрес пришел пакет (т.е. адрес сетевого интерфейса).
Я так думал, что это ABinding.IP . Однако он всегда = 0.0.0.0.
Добавлять на TIdUDPServer.Bindings сетевые сегменты не получается...
Что я делаю нетак? Помогите плиз. Уже целый день себе голову этим вопросом забиваю.


 
MaN|Ac   (2006-05-24 04:48) [1]


>  Однако он всегда = 0.0.0.0.

это ты как раз забиндил что слушать на всех

слушай только ан том интерфейсе на котором тебе надо
а если у тебя 0.0.0.0 а рассылка идет на БроадКаст

то соответственно логичный вывод что какждый интерфейс получит пакет


 
CLX   (2006-05-24 08:25) [2]


> это ты как раз забиндил что слушать на всех


Я ничего не биндил. TIdUDPServer.Bindings = []
Но это неважно. Понятно, что слушает всех. Вопрос в том, как мне указать чтобы он слушал только те интерфейсы, которые я хочу. Причём задавать  и менять нужно в процессе выполнения программы.
Т.е. как мне управлять TIdUDPServer.Bindings ?

пытался делать так:
 
 sh:=UDPServer.Bindings.Add;
 sh.IP:=NetInterface[0].IP;
 sh.Port:=8765;
 sh.AllocateSocket;

В итоге получаю Exception при получении пакета либо при закрытии приложения.


 
umbra ©   (2006-05-24 11:00) [3]

а какой эксепшен, если не секрет?


 
CLX   (2006-05-24 12:12) [4]

Всё.
Всем спасибо!
Вроде разобрался.
Я просто забывал UDPServer.Active:=false делать.
Совсем запутался :)

Правильно делать так (может кому еще пригодится):

 sh:TIdSocketHandle;
...
 UDPServer.Active:=false;
 UDPServer.Bindings.Clear;
 sh:=UDPServer.Bindings.Add;
 sh.IP:="192.168.1.1";
 sh.AllocateSocket;
 UDPServer.Active:=true;

Bindings.Clear делать обязательно, т.к. по умолчанию там уже висит один интерфейс (0.0.0.0)
Порт указывать не обязательно, он при Allocated берётся из TIdUDPServer.DefaultPort.



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.039 c
2-1159900578
sinus
2006-10-03 22:36
2006.10.22
Сокеты


15-1159470172
EkZot
2006-09-28 23:02
2006.10.22
Как прервать цикл for


15-1159169977
Тугодум
2006-09-25 11:39
2006.10.22
В чем корни пассивности общества?


2-1160053032
Pol
2006-10-05 16:57
2006.10.22
Виснет прога


2-1160235889
TitAn
2006-10-07 19:44
2006.10.22
Как прописать...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский