JokerjarЦитата: Вопрос: Нужен пример алгоритма: сервер отсылает через сокет файл по кусочкам, а клиент принимает и собирает все в один файл... (на чистом winsock).
Для блокирующих сокетов я делал такие функции передачи и приёма блока данных произвольной длины (с доотправкой и доприемом):[more]
Код: const
MAX_BUF_LEN = 32768; //превышать это значение нельзя!
{-------------------------------------------------------------------------------
Отправить блок данных через TCP соединение.
Если ошибка, возвращает SOCKET_ERROR, если успех - длину отправленного
блока (Len)
-------------------------------------------------------------------------------}
function SendData(sock: TSocket; const Data; Len: Integer): Integer;
var
i, j: Integer;
begin
result := 0;
i := Len;
while result <> Len do begin
j := i;
if j > MAX_BUF_LEN then j := MAX_BUF_LEN;
result := send(sock, Pointer(Integer(@Data) + result)^, j, 0);
if result = SOCKET_ERROR then Exit;
Dec(i, result);
result := Len - i
end
end;
{-------------------------------------------------------------------------------
Получить блок данных через TCP соединение
Результат - количество полученных байт.
Если результат 0, а Len не ноль, значит соединение gracefully завершено
удалённой стороной.
-------------------------------------------------------------------------------}
function RecvData(sock: TSocket; out Data; Len: Integer; Flags: LongWord = 0): Integer;
var
i, j: Integer;
begin
result := 0;
i := Len;
while result <> Len do begin
j := i;
if j > MAX_BUF_LEN then j := MAX_BUF_LEN;
result := recv(sock, Pointer(Integer(@Data) + result)^, j, 0);
if result = 0 then result := SOCKET_ERROR;
if (result = SOCKET_ERROR) then Exit;
Dec(i, result);
result := Len - i
end
end;