Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2010, 23:09   #1
Deman005
Пользователь
 
Регистрация: 09.04.2010
Сообщений: 24
По умолчанию свойства idTCPServer

как программно изменить ip адресс и порт в этом компоненте пишет только для чтения

[Error] Unit5.pas(35): Cannot assign to a read-only property

вот код

form3.IdTCPServer1.Bindings.Items[0].PeerIP:=edit1.text
form3.IdTCPServer1.Bindings.Items[0].PeerPort:=strtoint(edit2.Text)


кто знает подскажите плиз
Deman005 вне форума Ответить с цитированием
Старый 03.05.2010, 23:57   #2
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Сервер на то и сервер, чтобы принимать, а когда он принимает пакеты, то принимает их с определенного IP-адреса машины, которая их отправила. Так уж устроен этот компонент, и основан он на общепринятых правилах отправки-приема (пример: письмо, написанное от руки имеет адреса отправителя). Как вы собираетесь менять IP-адрес, от куда вам пришел пакет??? Тоже самое, вы скажите, что можете ходить по потолку Abinding.PeerIP - вызывается для того чтобы узнать адрес отправителя, поменять её НЕЛЬЗЯ по выше приведенной причине. Тоже самое косается и порта! (Abinding.PeerPort).
Если у вас задача, поменять порт на сервере, то юзайте tIdUDPServer.DefaultPort;
Код:
....
Var Server:TIdUDPServer;
....
Server.DefaultPort:=strtoint(edit2.Text);
Что косается IP, то... ...давайте конкретнее! Цель прогаммы какая? А то непонятно что вы хотите, и помочь вам полноценно не получется...
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 04.05.2010, 13:59   #3
Deman005
Пользователь
 
Регистрация: 09.04.2010
Сообщений: 24
По умолчанию

Ну у компонента idTCPServer тоже должен же быть ip адресс чтоб отправитель знал куда отправлять пакеты. вот его я и хочу задать програмно. Я хочу чтоб Программа с компонентом idTCPServer запускалась на любом компе без среды делфи. А без среды я не могу указать в свойстве bindings ip адресс данного компьютера. а если ip адресс в свойстве bindings не совпадает с ip данного компа программа выдает ошибку, может как то автоматически можно определять ip адресс машины на которой запущена прога ? помогите плиз

Последний раз редактировалось Deman005; 04.05.2010 в 14:05.
Deman005 вне форума Ответить с цитированием
Старый 04.05.2010, 14:16   #4
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Можно. В библиотеке инди есть ещё один замечательный компонент, называется он IdIPWatch, находится на вкладке Indy Misc. Кидаете его на форму, в программе пишите код:
Код:
<переменная типа string>:=<имя вашего компонента>.LocalIP;
в переменной будет локальный айпи адрес машины, на которой запущена прога. Но дело я так понял не в этом... Если хотите получить IP машины от куда запущена прога, то вы должны своей прогой разослать сообщение вида #0#1 или #0#2 или какое хотите с помощью:
Код:
Server.Broadcast(#0#1,Server.DefaultPort); //если вам известен порт
С помощью этого кода программа отправляет всему диапазону Ip-адресов сети сообщение #0#1 (смотрите ASCII таблицу). Для чего это надо? А для того чтобы прога, запущенная на удаленном компьютере обработала его, но опять же-таки в коде той проги надо сделать обработчик сообщения:
Код:
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
Var str:string;
begin
setlength(str,Adata.Size);
Adata.Seek(0,soFromBeginning);
Adata.ReadBuffer(Pointer(Str)^,AData.Size);
If pos(#0#1,Str)=1 then
Server.Send(ABinding.PeerIP,Server.Port,#0#2);
end;
А на своей проге добавить такой обработчик:
Код:
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
Var str:string;
begin
setlength(str,Adata.Size);
Adata.Seek(0,soFromBeginning);
Adata.ReadBuffer(Pointer(Str)^,AData.Size);
If pos(#0#2,Str)=1 then
Str:=Server.Abinding.PeerIP;
end;
Именно из этой переменной вы и сможете считать IP-адрес, от куда пришел ответ, на отправленный вами запрос по всему диапазону Ip-адресов вашей сети
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 04.05.2010, 14:21   #5
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

И кстати, чтож вы так к этому bindings привязались?! Он определяет подключения, связи, которые есть сейчас между клиентами-серверами или сервера-серверами.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 04.05.2010, 14:35   #6
Deman005
Пользователь
 
Регистрация: 09.04.2010
Сообщений: 24
По умолчанию

Ну просто гинеально . Спасибо большое. А это в глобальной сети интернет. Если мой провайдер использует VPN
Deman005 вне форума Ответить с цитированием
Старый 04.05.2010, 14:41   #7
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Я привел пример для локальной сети (локальная сеть, которую обеспечивает провайдер, если обеспечивает, локальная сеть с помощью хабов и свичей, маршрутизаторовом и потобной лабуды...) С интернетом будет сложнее. Понимаете в чем дело... не у всех есть выделенные IP-адреса, кто-то выходит в интернет через IP, который обеспечивает провайдер для своих подключившихся, а там уже идет фильтрация на сервере, чтобы не занести всякую дрянь к себе и к людям, и по этому ваши попытки будут неумолимо блокироваться Выхода из этой ситуации кроме как выделенного сервера, я не вижу, увы. Хотя возможно со временем найду, а если и есть такие решения, то они где попалоне валяются.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 04.05.2010, 14:53   #8
Deman005
Пользователь
 
Регистрация: 09.04.2010
Сообщений: 24
По умолчанию

в смысле выделенного сервера?? веб сервера что ли??
Deman005 вне форума Ответить с цитированием
Старый 04.05.2010, 14:57   #9
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Знаете программу QIP или ICQ? Вот они используют выделенный сервер. Имеется ввиду, серверный компьютер с выделенным IP, через который будут идти все запросы. Ну и соответственно, обеспечить ему свободный вход по какому-либо порту во всех интернет компаниях. (ICQ использует 80 например).
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
IdTCPServer Pankhammer Работа с сетью в Delphi 0 30.04.2010 00:14
IDTCPServer IP адрес SERG1980 Работа с сетью в Delphi 1 28.05.2009 16:43
IdTCPServer отправка сообщений. gusluk Работа с сетью в Delphi 3 08.04.2009 09:43
IdTCPServer Exception Comer_Jus Работа с сетью в Delphi 2 25.06.2008 22:23
IdTcpClient и idTcpServer xTANATOSx Работа с сетью в Delphi 9 17.05.2008 23:11