![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача массива по сети
Sp1r1t © (2007-02-23 15:40:00)Подскажите плс как по сети передать массив?
Alexey (AZ) (2007-02-25 18:55:00) [1]Это не передача первого элемента, это так мы указываем с какого места надо начинать передачу. Это можно и не указывать.
> Если можете, напишите плс как прочесть из Stream этот массив
> и запихнуть его в переменную ar.
>
stream.position := 0;
stream.Read(ar,ReadSize);
Sp1r1t (2007-02-25 18:37:00) [2]и еще вопрос t.Write(ar[0],sizeof(ar)); - передача 1-го эл-та массива в поток. Как передать все элементы? Может вопрос туповатый )) - я просто не совсем понимаю принцип работы TStream - если есть ссылочка дайте плс.
Sp1r1t (2007-02-25 18:33:00) [3]У меня наоборот - СЕРВЕР пишет в Stream:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
const ar : array[0..5] of char = ('A','B','C',#39,#00,'B');
var t:TMemoryStream;
begin
try
t := TMemoryStream.Create;
t.Write(ar[0],sizeof(ar));
t.Position := 0;
Athread.Connection.WriteStream(t,false,false);
//t.Size - пишет что лишний параметр
AThread.Connection.Disconnect;
finally
t.Free;
end;
Проблема: Не пойму как читать из Stream. И почему процедуры
WriteStream(Tstream,Boolean,Boolean) отличается от
ReadStream(TStream,AbyteCount:LongInt,Boolean) - во Write не надо указывать к-во отсылаемых байт а в Read - надо.
Если можете, напишите плс как прочесть из Stream этот массив и запихнуть его в переменную ar.
procedure TForm1.Button1Click(Sender: TObject);
var
t : TMemoryStream;
ar : array [0..5] of char;
begin
try
t := TMemoryStream.Create;
t.Position := 0;
Client.Connect;
Client.ReadStream(t,t.Size,false);
Client.Disconnect;
finally
t.Free;
end;
Alexey (AZ) (2007-02-25 11:00:00) [4]
> я использую компоненты Indy. Строку например передавать
> легко - WriteLn,Readln. А как мне передать масив? - какие
> методы нужно использовать?
В моих инди к сожалению нет WriteLn и ReadLn, или я плохо искал. Вот так получилось передать массив у меня при помощи Индейского ТЦП клиента.
procedure TForm1.Button1Click(Sender: TObject);
const
ar : array[0..5] of char = ('A','B','C',#39,#00,'B');
var
t : TMemoryStream;
begin
try
t := TMemoryStream.Create;
t.Write(ar[0],sizeof(ar));
t.Position := 0;
IdTCPClient1.Connect();
IdTCPClient1.WriteStream(
t,false,false,t.Size
);
IdTCPClient1.Disconnect;
finally
t.Free;
end;
end;
Sp1r1t (2007-02-24 20:54:00) [5]Напишите хоть какойто пример плс ктонибудб для передачи массива или записи по сети с помощью Инди компонентов
Alexey (AZ) (2007-02-24 16:23:00) [6]SendBuf/SendStream или как там их... Можете даже в string загнать ваш массив и толкнуть, т.к. в делфи string не то же самое что Null-Terminated string в понимании ВиндовозАПИ.
Принять - ReadLn, ReadBuf, etc.
Sp1r1t (2007-02-24 16:00:00) [7]я использую компоненты Indy. Строку например передавать легко - WriteLn,Readln. А как мне передать масив? - какие методы нужно использовать?
alexm_hs (2007-02-23 17:04:00) [8]Хотя мужно и не мудрить с сокетами а взять готовые компоненты Indy: TidTCPClient @ TidTCPServer
alexm_hs (2007-02-23 17:03:00) [9]поищите пример отправки TCP пакета через сокеты. Там используется функция
SendTo(Sock, Data, DataBytes, 0, Target, SizeOf(Target));
Как раз в качестве Data можно подсунуть array of.... Либо PChar и т.д. А на принимаемом хосте слушать установленный порт. Примеров тоже предостаточно. Ищите по ключевым словам socket, PF_INET, SendTo, TSockAddrIn т.д.