Главная страница
    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.46 MB
Время: 0.033 c
1-1105637174
redlord
2005-01-13 20:26
2005.01.30
проверка на наличие компонента созданного в рантайме


14-1105437303
ghg
2005-01-11 12:55
2005.01.30
насколько критичны ошибки в D2005?


14-1105457958
Kerk
2005-01-11 18:39
2005.01.30
LG G5400


14-1105191129
Luba
2005-01-08 16:32
2005.01.30
конверсия форматов


1-1105774192
Phantomouse
2005-01-15 10:29
2005.01.30
Как отследить закрытие программы





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