![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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