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

Вниз

Не могу задать порт источника в TIdUDPClient (Delphi 6)   Найти похожие ветки 

 
Vlad-Sh   (2002-11-29 06:33) [0]

Написал программу, в ней использую компонент TIdUDPClient.
Все вроде нормально пакеты отправляются, но значение порта источнока получается какое-то левое и меняется с каждым запуском программы (от 1035 до 1339). Задаю значение свойства IdUDPClient.Binding.Port:=8090 перед выполнением IdUDPClient.Send, но результат ноль.

Что за глюкодром? Подскажите как победить плиз.

Заранее спасибо.


 
Digitman   (2002-11-29 08:41) [1]


> Что за глюкодром


Никакого "глюкодрома". Все как положено.
А зачем тебе порт источника ? Тебя порт приемника должен волновать, ты приемнику шлешь сообщения (указывая его, приемника, IP+порт), а не самому себе. А приемник - отнюдь не TIdUDPClient, а TIdUDPServer. Только серверная сторона имеет возможность и право выбирать порт (и то - далеко не произвольным образом)


 
Vlad-Sh   (2002-11-29 09:40) [2]

А зачем тебе порт источника ?

Чтоб сервер (TIdUDPServer) знал на какой порт он может ответить(у меня "данные" от клиента к серверу идут по одному порту, а "управление" по другому). Можно конечно указать порт источника отдельно, но если есть в структуре UDP пакета поле порт источника, то почему бы его не использовать?


 
Digitman   (2002-11-29 10:04) [3]

Хэлп и примеры в Indy для кого писаны ? Для Пушкина ?

Открываю папку
C:\Program Files\Borland\Delphi\3rdparty\Indy\Demos\Delphi\UDPClientServer

и привожу выдержку из демо-чата на интересующих тебя компонентах.

Смотри сюда и не говори, что у тебя нет этого примера. Он идет в штатной поставке Indy-пакета :


procedure TUDPMainForm.UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
DataStringStream: TStringStream;
s: String;
begin
DataStringStream := TStringStream.Create("");
try
DataStringStream.CopyFrom(AData, AData.Size);
UDPMemo.Lines.Add("Received "" + DataStringStream.DataString + "" from " + ABinding.PeerIP + " on port " + IntToStr(ABinding.PeerPort));
s := "Replied from " + UDPServer.LocalName + " to "" + DataStringStream.DataString + """;
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s[1], Length(s));
finally
DataStringStream.Free;
end;
end;



 
Vlad-sh   (2002-11-29 10:56) [4]

Это все я видел, но мне надо немного не то. Я хотел бы иметь возможность указывать самому порт источника в TIdUDPClient при отправке пакета. Запусти пример и посмотри, в UDPserver как изменяется значение порта после "on port". Запускаю "клиент" на одной машине - on port 1039, на другой on port 4938 (значение почти случайно). А мне надо задать его в TIdUDPClient, например 8091, но не получается.


 
Digitman   (2002-11-29 11:09) [5]


> А мне надо задать его в TIdUDPClient, например 8091, но
> не получается.


Зачем ?? Какая клиенту разница, какой он порт занял ? Важно, что сервер, получив дейтаграмму, с этого момента "знает" клиента "в лицо". И по барабану серверу, какое это "лицо" - ответить клиенту он в состоянии, ибо дейтаграмма клиента известила сервер о тек.координатах клиента


 
Vlad-sh   (2002-11-29 12:00) [6]

Вопрос чисто технический - как сделать, а не зачем. Я не люблю неопределенности, по этому хочу что-бы порт источника был фиксированный и не "плавал".


 
Digitman   (2002-11-29 12:31) [7]


> Я не люблю неопределенности


Раз не любишь - читай документацию на на Winsock и изучай исх.текст компонента. Тогда и вопросов не будет и определенность появится.
А в документации сказано, что для явной фиксации порта перед вызовами прочих транспортно-диспетчерских ф-ций д.б. выполнена ф-ция bind() с соотв.параметрами. Клиентские же компоненты (TIdXXXClient - не исключение) как правило bind() не выполняют, ибо в этом нет нужды, да и как правило смысла. Если клиенту известны коорд-ты сервера, ему (клиенту) достаточно выполнить connect()/sendto(), в ходе исполнения которых кл.гнездо получит уникальные координаты, в т.ч. номер порта из свободных в диапазоне 1024-5000. Этого достаточно, чтобы сервер (выполнив accept() либо приняв дейтаграмму) имел достаточную инф-цию о кл.координатах для обратной связи с ним.


 
Vlad-sh   (2002-11-29 13:19) [8]

Спасибо, но:

Делаю
idUDPClient.Binding.Port:=8090;
idUDPClient.Binding.Bind;

затем
idUDPClient.Send

Пакеты вообще к серверу не идут.

Блин, что-то я не так делаю. Как же сделать то правильно?


 
Digitman   (2002-11-29 13:43) [9]

Блин, ну что ж за упрямство-то такое ослиное ?
Ты вообще собираешься док-цию читать и исходники Indy ?

Ну нет ! Нет там нигде установки опции Id_SO_REUSEADDR !!!
Какого черта ты пытаешься привязаться к фикс.адресу, я никак не пойму ? Ну нахрен тебе это надо - знать порт источника ДО вызова send() ? Что тебе это КОНКРЕТНО даст ? Какие преимущества перед динамическим распределением порта ?


 
Vlad-sh   (2002-11-29 14:00) [10]

Да не упрямый я. Просто всего с неделю занимаюсь с сетевыми компонентами. Опыта мало. Буду более детально разбираться (доки читать :)). Спасибо за советы, теперь знаю куда копать.


 
Digitman   (2002-11-29 14:20) [11]


> неделю занимаюсь с сетевыми компонентами


И сразу - за UDP-чат взялся) ... Рановато, imho



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

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

Наверх




Память: 0.47 MB
Время: 0.008 c
6-87002
Dimman
2002-11-29 17:00
2003.01.27
New questions about TWebBrowser


14-87077
kostya2000
2003-01-08 19:43
2003.01.27
Какая ОС вам больше всего нравится? Почему?


14-87035
Феликс
2003-01-03 21:40
2003.01.27
---|Ветка была без названия|---


1-86906
AM
2003-01-16 13:15
2003.01.27
Странное поведение fsMDIChild формы, или ...


1-86913
Бук
2003-01-16 14:06
2003.01.27
Понять не могу где ошибка





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский