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

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

ClientSocket [D6, Win2k]


Страницы:   1 2 3 4

Dmitriy Polskoy ©   (2002-11-13 14:43:00) 

Подскажите, как сделать так, чтобы ClientSocket принимал ровно столько сколько передает ServerSocket. Объясняю - ServerSocket в
OnClientRead получает имя файла и затем передает его клиенту по 500 байт
AssignFile(SrcFile, FileName);
Reset(SrcFile,1);
try
repeat
BlockRead(SrcFile, Buffer, SizeOf(Buffer), BytesRead);
ServerSocket.Socket.Connections[0].SendBuf(Buffer, BytesRead);
until BytesRead = 0;
finally
CloseFile(SrcFile);
end;

А клиент принимет, но не 500 байт за раз, а другое число байт.
Я знаю, что это нормально, но как сделать, чтобы и принимал 500.
А то файл бьется.


F1   (2002-11-13 15:27:00) [61]

Попробуй так:
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
BytesRead := Socket.ReceiveLength;
Res:=Socket.ReceiveBuf(Buffer, BytesRead);
BlockWrite(DestFile, Buffer, Res, BytesWritten);
sum := sum + Res;
label1.Caption := inttostr(sum);
end;

А то что Digitman раньше писал, точно работает!!!
Он по сетям хороший спец!!!


Dmitriy Polskoy   (2002-11-13 15:21:00) [62]

Да читал я. И вроде все работает, но на определенных размерах, а потом байты теряются. По 500 это непринципиально. Это число мой сервер будет определять исходя из размера файла.


F1   (2002-11-13 15:16:00) [63]

Кстати Digitman уже много раз писал как ПРАВИЛЬНО передавать данные чере сокеты, поищи.


F1   (2002-11-13 15:14:00) [64]

А тогда зачем тебе именно по 500 байт читать???
Или все-таки надо???


Dmitriy Polskoy   (2002-11-13 15:13:00) [65]

2 F1 © (13.11.02 15:08)
Да. Это я протупил.


Dmitriy Polskoy   (2002-11-13 15:10:00) [66]

2 all
Делаю так, а как надо?
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
BytesRead := Socket.ReceiveLength;
Socket.ReceiveBuf(Buffer, BytesRead);
BlockWrite(DestFile, Buffer, BytesRead, BytesWritten);

sum := sum + bytesread;
label1.Caption := inttostr(sum);
end;


F1   (2002-11-13 15:08:00) [67]

Result не может быть > Count!!!


Dmitriy Polskoy   (2002-11-13 15:07:00) [68]

2 Digitman © (13.11.02 15:01)
А как решить Dmitriy Polskoy © (13.11.02 15:01) и
если Result > Count?


F1   (2002-11-13 15:05:00) [69]

>Dmitriy Polskoy © (13.11.02 15:01)
>Не получится, т.к в OnRead...
А циклы начто???


Digitman   (2002-11-13 15:01:00) [70]


> как сделать, чтобы и принимал 500.


Принимай не более 500 байт за один раз. И всех делов.

см. function ReceiveBuf(var Buf; Count: Integer): Integer;

Count - сколько запросил для приема
Result - сколько реально принято

Result >= 0 , но Result < Count ?

Не проблема. Уменьшай Count на значение Result, смещай позицию в буфере на значение Result и повторяй в цикле, пока Count > 0. После этого передавай адрес цельного принятого блока в 500 байт на обработку.


Dmitriy Polskoy   (2002-11-13 15:01:00) [71]

2 F1 © (13.11.02 14:50)
Не получится, т.к в OnRead надо получить кол-во байт, которое пришло. Иначе опять будет сбой - файл оказывается в ~4 раза больше


Dmitriy Polskoy   (2002-11-13 14:56:00) [72]

Сокет я закрываю при закрытии клиента.
Кстати на небольших объемах (до 1 Мб) файл передается нормально,
а например, при файл в 170 Мб отправляется весь объем, а принимается меньше. Где он теряется?


F1   (2002-11-13 14:50:00) [73]

ClientSocket1.Socket.ReceiveBuf(buf,500); ???


Song   (2002-11-13 14:47:00) [74]

В приведённом примере не видно когда Вы делаете закрытие сокета.


Страницы:   1 2 3 4

Наверх

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