Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.27;
Скачать: CL | DM;

Вниз

Не могу задать порт источника в 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
6-87014
Nikolay Enby
2002-11-27 21:10
2003.01.27
Вопрос о работе c локальной сетью.


14-87042
ssmaxx
2003-01-10 18:50
2003.01.27
Преобразование строк в...


7-87152
Sergey_MV
2002-11-14 14:06
2003.01.27
Момент завершения работы винды?


1-86955
ivansv
2003-01-16 05:17
2003.01.27
Как узнать число видимых строк в TRichEdit


1-86832
Dor
2003-01-19 11:58
2003.01.27
Есть label1,нужно что в label1.caption было текущее время