![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
PByteArray [D6, WinXP]
R2D2 © (2004-08-05 16:33:00)Как переслать на др. компьютер (проге-клиенту) массив байт (PByteArray).
R2D2 (2004-08-08 16:55:00) [1]Предыдущий код совершенно не такой! А вот такой:
var
pic1, pic2: PByteArray;
...
begin
...
for y := 0 to bitmap.Height - 1 do begin
pic1:= bitmap.ScanLine[y];
Size := ServerSocket1.Socket.Connections[0].SendBuf(pic1,SIZEOF(pic1)); //отсылаю
end;
На другом компе получаю:
begin
...
oo := bitmap.ScanLine[y];
...
Socket.ReceiveBuf(ooo,Sizeof(oo)); //принимаю
for x := 0 to b.Width * 3 - 1 do
oo^[x] := round(ooo^[x]); //возникает ошибка
...
R2D2 (2004-08-08 16:16:00) [2]Переделал с использованием ClientSocket и ServerSocket. Выглядит так:
var
p: PByteArray;
...
begin
...
p := bitmap.ScanLine[y];
MyStream := TMemoryStream.Create;
MyStream.WriteBuffer(p,SIZEOF(p)); //загоняю
MyStream.Position:=0;
Size := ServerSocket1.Socket.Connections[0].SendBuf(ppp,MyStream.Size); //отсылаю
...
На другом компе получаю:
begin
...
oo := bitmap.ScanLine[y];
...
Socket.ReceiveBuf(ooo,Sizeof(oo)); //принимаю
for x := 0 to b.Width * 3 - 1 do
oo^[x] := round(ooo^[x]); //возникает ошибка
...
Причем ошибка возникает только тогда, когда "работают" 2 программы (клиент и сервер). А если весь код написан в ондой проге (она клиент и сервер), то все ОК, работает как надо! В чем может быть проблема?
Digitman (2004-08-06 13:46:00) [3]var
p: PByteArray;
...
begin
...
p := bitmap.ScanLine[y];
MyStream := TMemoryStream.Create;
MyStream.WriteBuffer(p ^, фактический_размер_буфера_!!!!!);
MyStream.Position:=0;
NMUDP1.SendStream(MyStream);
...
MyStream := TMemoryStream.Create;
NMUDP1.ReadStream(MyStream);
MyStream.Position:=0;
GetMem(p, MyStream.Size);
MyStream.ReadBuffer(p ^,MyStream.Size);
> выдает ошибку
кр.всего прочего ошибка (причем грубая, связанная с особенностями UDP и с "кривостью" NMUDP, явно не учитывающего эти особенности) обязательно возникнет, если размер передаваемого потока превышает макс.доп.размер UDP-сообщения
Goorus (2004-08-06 13:25:00) [4]MyStream.WriteBuffer(p,SIZEOF(p));
В p у тебя хранится только ссылка на массив, это величина вроде Integer, и занимает она 4 байта. Делай, как говорит Kurtevich.
Kurtevich (2004-08-05 17:47:00) [5]
var p: pByteArray;
len : integer;
s: SOCKET;
winsock2.send(s,p^[0],len,0);
R2D2 (2004-08-05 17:43:00) [6]Загоняю! Выглядит так (в кратце):
var
p: PByteArray;
...
begin
...
p := bitmap.ScanLine[y];
MyStream := TMemoryStream.Create;
MyStream.WriteBuffer(p,SIZEOF(p)); //загоняю
MyStream.Position:=0;
NMUDP1.SendStream(MyStream); //отсылаю
...
Как получить этот массив на др. компе?
begin
...
MyStream := TMemoryStream.Create;
NMUDP1.ReadStream(MyStream); //принимаю
MyStream.Position:=0;
MyStream.ReadBuffer(p,NumberBytes);
...
Так выдает ошибку.
Rouse_ (2004-08-05 16:34:00) [7]Загоняй в Stream и пересылай...