Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];

Вниз

Передача 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.039 c
14-1105268110
Kerk
2005-01-09 13:55
2005.01.30
distributed.net


1-1106050793
AlexLumpov
2005-01-18 15:19
2005.01.30
Уменьшить rtl70.bpl


9-1098489583
Malij
2004-10-23 03:59
2005.01.30
OpenGl


1-1105965427
pasha_golub
2005-01-17 15:37
2005.01.30
Принцип работы TDataset.Locate


4-1102862815
Goblin V
2004-12-12 17:46
2005.01.30
Создание драйвера устройства под Windows





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский