![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Смена портов NMMsg и NMStrm [D5, D6]
Andrew2 © (2002-08-05 13:03:00)Не хотят у меня порты меняться на этих компонентах. Как скомпилиш например с тем что по умолчанию 6711 так и работают. Присваиваю другой номер - connection failed, возвращаю родной - снова нормально. Можно конечно с другим компилировать, но надо-бы в процессе работы как-то менять, чтоб к другими такими-же програмками конектиться.
Спасибо.
Digitman (2002-08-07 14:27:00) [1]Та ведь - просто это, как "дважды два" !
Исходники-то есть перед глазами ? Думаю, что - должны быть, иначе - на кой черт такой Indy нужен.
Ну так глянь в них да посмотри, есть ли где-либо при инициализации гнезда строчка, вызывающаяя WinsockAPI-ф-цию SetSockOpt().
Если есть, смотри, откуда берутся параметры для установки опций
SO_RCVTIMEO int Receive time-out
SO_SNDTIMEO int Send time-out
Если - нет, можешь считать, что Indy не менее "кривой", чем FastNet.
Sterh-By (2002-08-07 13:35:00) [2]Ну, а зачем тогда такой ограниченый компонент нужен ?
Программа ведь должна настраиваться.
Я, вот пытаюсь использовать Indy для этих целей, но не могу в"ехать, как задать таймауты для функций чтения/записи.
Имеются в виду компоненты IdTCPServer & IdTCPClient.
Использую ф-ии TIdTCPConnection.ReadBuffer & TIdTCPConnection.WriteBuffer
Может кто подскажет ?
Digitman (2002-08-07 13:01:00) [3]>Sterh-By
Почему сразу - "в кривости" ? Разработчик четко обозначил ограничения, с чем это связано - это уже иной вопрос.
А автор как раз, как я понял, и подразумевает смену порта именно в design-time. Нет ничего говорящего о смене порта в run-time и в приведенном им коде.
Sterh-By (2002-08-07 12:51:00) [4]Вся суть в кривости компонент FastNet.
Выдержка из хелпа для TNMStrmServ:
property Port: Integer;
...
Accessibility: Runtime*, Designtime
Notes:
* In the case of the TNMGeneralServer, the Port property must be set during designtime.
Динамически создать об"єкт не удалось :(
Andrew2 (2002-08-06 10:58:00) [5]Пища для размышлений...
Поковыряюсь в этом направлении
Спасибо за помощь :)
Digitman (2002-08-06 10:54:00) [6]Нет, ну а метод TPowersock.Listen() кто за тебя будет вызывать ? Каким образом серверная сторона может быть активизирована без вызова этого метода ?
Да еще и с Accept() - тот же вопрос : как ты акцептируешь и акцептируешь ли явно входящие кл.запросы на соединение ?
Andrew2 (2002-08-06 10:34:00) [7]Сами наверно :)
Я больше ничего с ними не делаю.
Digitman (2002-08-06 10:18:00) [8]Я что-то не вижу, где, в какой момент и как активизируется NMMSGServ1 и NMStrmServ1MSG, т.е. серверные стороны
Andrew2 (2002-08-06 10:05:00) [9]Мой римоут менеджер запрашивает файл
procedure TForm1.Getfile1Click(Sender: TObject);
begin
LogFileName:=ListBox1.Items.Strings[ListBox1.ItemIndex];
NMMsg1.FromName := "file";
NMMsg1.PostIt(LogFileName);
MemoEvents.Lines.Add("Asking for file "+LogFileName);
end;
Агент отвечает
procedure TForm1.NMMSGServ1MSG(Sender: TComponent; const sFrom,
sMsg: String);
var
MyFStream: TFileStream;
f,f_old,f_update: Textfile;
sr,sr_old: TSearchRec;
flag,FileAttrs: Integer;
s,s2: string;
Bool:Boolean;
begin
if pos("file",sFrom)>0 then
begin
LogFileName:=Copy(sMsg,Pos(":",sMsg)+1,Length(sMsg)-Pos(":",sMsg));
EditLogFileName.Text:=LogFileName;
ListBoxFiles.ItemIndex:= ListBoxFiles.Items.IndexOf(LogFileName);
if (LogFileName="..") or isDir(LogFileName) then
begin
ListBoxFilesDblClick(Form1);
ReadList(CurrDir);
NMStrm1.FromName := "list:"+CurrDir;
MyFStream := TFileStream.Create("list.txt", fmOpenRead);
try
NMStrm1.PostIt(MyFStream);
finally
MyFStream.Free;
end;
MemoEvents.Lines.Add("list sent");
end
else
begin
NMStrm1.FromName := "file:"+LogFileName;
MyFStream := TFileStream.Create(LogFileName, fmOpenRead);
try
NMStrm1.PostIt(MyFStream);
finally
MyFStream.Free;
MemoEvents.Lines.Add("file sent");
MemoFile.Lines.LoadFromFile(LogFileName);
MemoFile.Lines.SaveToFile("Old_log.txt");
end;
end;
end;
end;
админ ловит файл
procedure TForm1.NMStrmServ1MSG(Sender: TComponent; const sFrom: String;
strm: TStream);
var
c,f,i: integer;
MyFStream: TFileStream;
f_log,f_update: TextFile;
s: string;
begin
MemoEvents.Lines.Add("From :: "+sFrom);
if Pos("file",sFrom)>0 then
begin
LogFileName:=Copy(sFrom,Pos(":",sFrom)+1,Length(sFrom)-Pos(":",sFrom));
If FileExists(LogFileName) then DeleteFile(LogFileName);
MyFStream := TFileStream.Create(LogFileName, fmCreate);
try
MyFStream.CopyFrom(strm, strm.size);
finally
MYFStream.Free;
end;
MemoFile.Lines.LoadFromFile(LogFileName);
GroupBox2.Caption:=LogFileName+" "+DateTimeToStr(Now);
MemoEvents.Lines.Add("received file ""+LogFileName+""");
end;
end;
Digitman (2002-08-06 09:40:00) [10]Приведи код.
Andrew2 (2002-08-06 08:24:00) [11]Это я для работы утилиту такую написал, где на моей машине клиент с NMMsg и NMStrmServ, а на другом конце агент с NMMSGServ и NMStrm. По MSG я управляю агентом, а он мне по STRM шлёт файлы. Возникла необходимость работать с несколькими агентами, а со сменой портов такая неприятность :(
Andrew2 (2002-08-06 08:16:00) [12]NMStrmServ
Digitman (2002-08-05 17:19:00) [13]TNMStrm не имеет отношения к серверной стороне : это - клиент.
Что используешь на серверной стороне ?
Andrew2 (2002-08-05 16:45:00) [14]Не нашёл в структуре NMStrm активацию/деактивацию.
Попробовал disconnect перед сменой портов - не преуспел.
Digitman (2002-08-05 16:29:00) [15]при смене порта на серверной стороне не забываешь вноыь активизировать его (сервер) ?
Andrew2 (2002-08-05 16:29:00) [16]Мне тут даже советуют убивать и создавать заново эти компоненты уже с другими портами :)
Andrew2 (2002-08-05 15:58:00) [17]Меняю порты с обоих сторон. Когда возвращаю в исходное состояние - конект возобновляется.
(спасибо digitman за быстрый ответ, боюсь мой промежуток в 5 часов уже убил этот диалог :(
Digitman (2002-08-05 13:08:00) [18]сервер на каком порту "слушает" ? Должен слушать на том же, попытку коннекта к которому осуществляет клиент