Главная страница
    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.46 MB
Время: 0.027 c
9-1098357098
VolanD
2004-10-21 15:11
2005.01.30
Direct3D


14-1105434976
ms
2005-01-11 12:16
2005.01.30
Скажите, можно ли зарабатывать на показе баннеров на своём сайте.


1-1105080743
GrayFace
2005-01-07 09:52
2005.01.30
Что такое packed array и packed record?


1-1106203838
DmiSb
2005-01-20 09:50
2005.01.30
Печать через IE


14-1105614843
Ilya___
2005-01-13 14:14
2005.01.30
Подскажите, где можно взять библиотеку FastDib для Делфи 7.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский