Показать сообщение отдельно

  #2  
Старый 29.10.2009, 10:49
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

Вопрос 1:
Вариант Result:=Send(Sock, PChar(S)^, Length(S), 0); приемлем для строк относительно не большого размера. Чтобы люде не говорили, что данные не смогт сразу послаться итд итп. но это уже более низкий уровень будет думать. А от тебя данные уйдут в ядро и вернется значение сколько данных послан. Именно послано, а не дошло.

Второй вариант - принципиально не правильный. Зачем копировать данные во временный буфер? Юзай указатели. т.е. это можно оформить примерно так:

Код:
function SendText(Sock: TSocket; S: String): Integer;
var
  SendLen: Integer;
  BufStart : pchar;
  BufLen : integer;
begin
  BufLen := Length(s); // сразу вычислим размер, чтобы потом постоянно не считать
  BufStart := @s[1]; // установим указатель на начало строки

  While ( BufLen > 0) do // если есть что отправлять
  begin
    if BufLen < 1024 then SendLen := BufLen else BufLen := 1024; // вычислим сколько байт отправлять. Но не более 1024 (1024- это так к примеру) 

    SendLen := Send(Sock, BufStart, SendLen, 0); // отправим
    if SendLen <= 0 then break; // если ошибка была то выйти из цикла отправки
    BufStart := pchar(dword(BufStart) + SendLen); // переместим указатель дальше
    BufLen := BufLen - SendLen; // уменьшим кол-во оставшихся данных 
  end;
end;
т.е. примерно так должно идти.

Второй вопрос. В принципе правильно.
 
Ответить с цитированием