Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передача 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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо