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