Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.30;
Скачать: CL | DM;

Вниз

Передача TStream   Найти похожие ветки 

 
Mr ©   (2004-11-15 07:49) [0]

Здраствуйте .....
Пишу вот такой сервер ...

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"

Подскажите в чем я не прав ...


 
Verg ©   (2004-11-15 08:20) [1]


> Подскажите в чем я не прав ...


В первую очередь вот в этом:

>  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;


 
Mr ©   (2004-11-15 19:56) [2]

Спасибо ..............
Я пытался по примеру сделать, видать пример не удачный...
А может кто даст ссылочку на правельный пример, был бы очень благодарен ...


 
Piter ©   (2004-11-15 22:25) [3]

А то, что Verg написал не судьба почитать и осмыслить?

Или нужен готовый пример? Тогда $10 и я подписываюсь



Страницы: 1 вся ветка

Текущий архив: 2005.01.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.025 c
14-1105687741
Ihor Osov'yak
2005-01-14 10:29
2005.01.30
Нужен совет о комплектации системы (сpu, monitor)


1-1106124455
Пчелка
2005-01-19 11:47
2005.01.30
Метод ObjNew компонента F1Book


14-1105632422
Tankist
2005-01-13 19:07
2005.01.30
Что вы думаете о Свидетелях Иеговы?


3-1104062538
Alex_S
2004-12-26 15:02
2005.01.30
Странности DBGrid при работе с InterBase


14-1105553691
GanibalLector
2005-01-12 21:14
2005.01.30
Открытое письмо болельщиков ФК "Металлист"