![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача TStream [D6, WinXP]
Mr © (2004-11-15 07:49:00)Здраствуйте .....
Пишу вот такой сервер ...
procedure TServerThread.ClientExecute;
var
Stream : TWinSocketStream;
Buffer : array[0 .. 25] of Char;
StreamSize: int64;
PacketStream: TMemoryStream;
begin
while (not Terminated) and ClientSocket.Connected do
begin
try
Stream := TWinSocketStream.Create(ClientSocket, 10000);
try
FillChar(Buffer, SizeOf(Buffer), 0);
if Stream.WaitForData(10000) then
begin
Stream.Read(Buffer, SizeOf(Buffer));
if Buffer='Get' then
begin
PacketStream:=TMemoryStream.Create;
DM.Query.Open;
DM.ClientDataSet.Open;
DM.ClientDataSet.SaveToStream(PacketStream);
StreamSize:=PacketStream.Size;
Stream.Write(StreamSize,SizeOf(StreamSize));
PacketStream.Position:=0;
Stream.Write(PacketStream,StreamSize);
end;
end
else
ClientSocket.Close;
finally
Stream.Free;
end;
except
HandleException;
end;
end;
end;
И вот такой клиент....
procedure TDM.LoadTable;
var
Stream : TWinSocketStream;
Buffer : array[0 .. 25] of Char;
PacketStream: TMemoryStream;
StreamSize:int64;
begin
frMain.ClientSocket.Address:='192.168.11.163';
frMain.ClientSocket.Port:=8000;
frMain.ClientSocket.Open;
Stream := TWinSocketStream.Create(frMain.ClientSocket.Socket, 10000);
FillChar(Buffer, SizeOf(Buffer), 0);
Buffer:='Get';
Stream.Write(Buffer,SizeOf(Buffer));
if Stream.WaitForData(30000) then
begin
Stream.Read(StreamSize,SizeOf(StreamSize));
end;
if Stream.WaitForData(30000) then
begin
PacketStream:=TMemoryStream.Create;
Stream.Read(PacketStream,StreamSize);
PacketStream.Position:=0;
ClientDataSet.LoadFromStream(PacketStream);
ClientDataSet.Open;
end;
frMain.ClientSocket.Close;
end;
При попытке выполнения следующих строчек кода:
PacketStream.Position:=0;
ClientDataSet.LoadFromStream(PacketStream);
Возникает ошибка:
Access violation at address XXXXXXXX in module 'aaaaaaaaa'
Подскажите в чем я не прав ...
Piter (2004-11-15 22:25:00) [1]А то, что Verg написал не судьба почитать и осмыслить?
Или нужен готовый пример? Тогда $10 и я подписываюсь
Mr (2004-11-15 19:56:00) [2]Спасибо ..............
Я пытался по примеру сделать, видать пример не удачный...
А может кто даст ссылочку на правельный пример, был бы очень благодарен ...
Verg (2004-11-15 08:20:00) [3]
> Подскажите в чем я не прав ...
В первую очередь вот в этом:
> Stream.Read( PacketStream,StreamSize);
Тут ты благополучно портишь сам PacketStream да и вообще стек.
Из-за этого же ты и передаешь не то, что нужно.
И в целом прием-передача сделаны неверно.
Нпример, прием:
Stream.Read не обязан читать весь streamsize. Read - это ф-ция, результатом которой является число прочитанных (принятых) байтов.
P : pchar;
LoadedSize : cardinal;
Readed : integer;
packetStream.SetSize(StreamSize);
P := PacketStream.Memory;
LoadedSize :=0;
while LoadedSize < StreamSize do
begin
Readed := Stream.Read(P[LoadedSize], StreamSize - LoadedSize);
if Readed <= 0 then
begin
break;
end;
Inc( LoadedSize, Readed );
end;
if Readed < 0 then
raise exception Create( SysErrorMessage(WSAGetLastError) )
else if Readed = 0 then
// Произошел разрыв соединения, либо истек таймаут
else begin
// Все, прием завершен нормально
end;