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

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

Socket.OnWrite


Страницы:   1 2

Akni ©   (2003-06-17 14:40:00) 

Ув. Мастера, помогите, пожалуйста, разобраться с событием OnWrite класса TCustomWinSocket.

Например, данные передаюся след. образом:
Var Res: integer;
…

procedure TForm1.Button1Click(Sender: TObject);
begin
Res:=ClientSocket1.Socket.SendBuf(iBuffer, BufSize);
end;

Если SendBuf() возвращает -1, то это значит, что данные не были переданы, т.к. буфер WinSock занят. И, как я понимаю, через некоторое время, когда освобождается место в буфере, должно возникнуть событие OnWrite, в котором можно повторить передачу данных:

procedure TForm1.ClientSocket1Write(Sender: TObject;
Socket: TCustomWinSocket);
begin
if Res=-1 then ClientSocket1.Socket.SendBuf(iBuffer, BufSize);
end;

Правильный ли это метод для избежания потерь данных при передаче через сокет?


Akni   (2003-06-17 16:23:00) [21]

Спасибо, буду думать дальше


Digitman   (2003-06-17 15:14:00) [22]

Нет, не совсем правильный.

procedure TForm1.ClientSocket1Write(Sender: TObject;
Socket: TCustomWinSocket);
begin
if Res=-1 then
( iBuffer, BufSize)

Нет, не совсем правильный.

procedure TForm1.ClientSocket1Write(Sender: TObject;
Socket: TCustomWinSocket);
begin
if Res=-1 then
Res := Socket.SendBuf(iBuffer, BufSize); // здесь тоже нужно фиксировать результат на случай, если между двумя последовательными событиями параметры iBuffer, BufSize изменились (например, ты переопределил буфер (увеличил его и записал в его конец очер.порцию данных, требуемых к передаче)
end;

кр.того, ты не учитываешь результат ваызова SendBuf() >= 0
при таком результате следует либо изменять адрес и размер буфера либо водить понятие "смещение 1-го передаваемого байта в буфере в событии OnWrite() и размер еще непереданных данных в этом буфере", если буфер - фиксированный и не переопределяется тобой


Страницы:   1 2

Наверх

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