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

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

Socket и Buffer [D6, WinXP]


Novichok ©   (2004-02-23 02:04:00) 

Передаю рисунок через Socket.
На стороне клиента следующий код

procedure TForm1.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
var
 count:Integer;
 buffer: Array [0..MAX_BUF_SIZE] of Char;
 s, s2: string;
 mk: Integer;
begin
 repeat
   Socket.Lock;
   count:= Socket.ReceiveBuf(buffer,SizeOf(buffer));
   if count > 0 then
   begin
     s:='';
//До того как начать пересылку файла, я отсылаю его размер – типа $sz123456$sz
     if Pos('$sz', buffer)=1 then
       begin
         s := buffer;
         Delete(s, 1, 3);
         mk := Pos('sz$', s);
         filesize := strtoint(copy(s, 1, mk-1));
         Delete(s, 1, mk+2);
         s2 := 'image.jpeg';
         fStream:= TFileStream.Create(s2, fmCreate);
       end
     else
       fStream.WriteBuffer(buffer,count);
   end;
   Socket.Unlock;
  until (count <= 0);
  if fStream.Size<>0 then
  begin
    s2 := inttostr(Round(fStream.Size/filesize*100));
    Form1.Caption:= 'take fail-'+ s2 + '%';
  end;
  if fStream.Size=filesize then
  begin
    fStream.Free;
    filesize:=0;
  end;
end;

Файл доходит (Хотя не всегда, иногда зависает на 93 процах или еще скольки), но что самое интересное во время приёма файла постоянно вылетает ошибка:
Access violation at address 004166A0 in module ‘Project1.exe’. Read of address 00000014.

Код серверной части:
   str := TMemoryStream.Create;
   str.LoadFromFile('image.jpg');
   n:=str.Size;
   ServerSocket1.Socket.Connections[1].SendText('$sz'+inttostr(n)+'sz$');
   ServerSocket1.Socket.Connections[1].SendStream(str);

Мастера кто знает где я напортачил ???


Polevi   (2004-02-26 11:23:00) [1]

>Verg ©   (26.02.04 10:26) [5]
вообщем все как обычно :-)


Verg   (2004-02-26 10:26:00) [2]


> [4] Polevi ©   (26.02.04 09:22)
> допустим ты прочитал 100 байт, и нашел свою строку $sz123456$sz
> как думаешь, куда деваются данные длиной Count-Length('$sz123456$sz')
> ???


Хуже всего, когда на первый Onread он прочитал $sz123, например.


> if count > 0 then
>    begin
>      s:='';
> //До того как начать пересылку файла, я отсылаю его размер
> – типа $sz123456$sz
>      if Pos('$sz', buffer)=1 then
>        begin


Это все сработает, а вот что будет дальше.... страшно подумать.
А так же варианты вервого приема
$sz123456$sz+Какой-то кусок уже от файла...
и т.д. и т.п.


Polevi   (2004-02-26 09:22:00) [3]

допустим ты прочитал 100 байт, и нашел свою строку $sz123456$sz
как думаешь, куда деваются данные длиной Count-Length('$sz123456$sz') ???


Verg   (2004-02-25 07:19:00) [4]

Устал уже спрашивать про режим сокета....
Какой, ctBlocking или ctNonBlocking ?


Novichok   (2004-02-24 23:09:00) [5]

неужели никто не может мне почь с этим ?! :(


Novichok   (2004-02-23 02:05:00) [6]

ups забыл код в теги взять sorry


Наверх

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