Форум: "Сети";
Текущий архив: 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