powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / recv выход из цикла
25 сообщений из 178, страница 5 из 8
recv выход из цикла
    #39711233
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это стандартные функции INDY
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711253
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovDima TНа 99% уверен что в его Indy встроенный самопальный протокол передачи набора строк. Не зря
же WriteStrings()/ReadStrings()

В моей версии инди таких функций вообще нет. Точнее они есть, но только как приватные в
FTP компонентах и они отсылают TStrings.Text как есть.

Судя по всему, у ТС 9-я версия, там это есть, да и в доках к лазарусу сказано, что у них 9-я.

WriteStrings
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TIdTCPConnection.WriteStrings(AValue: TStrings; const AWriteLinesCount: Boolean = False);
var
  i: Integer;
begin
  if AWriteLinesCount then begin
    WriteInteger(AValue.Count);
  end;
  for i := 0 to AValue.Count - 1 do begin
    WriteLn(AValue.Strings[i]);
  end;
end;


Т.е., в начале может передаваться число строк (а может и не передаваться), тут к ТС вопрос.
WriteInteger
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TIdTCPConnection.WriteInteger(AValue: Integer; const AConvert: Boolean = True);
begin
  if AConvert then begin
    AValue := Integer(GStack.WSHToNl(LongWord(AValue)));
  end;
  WriteBuffer(AValue, SizeOf(AValue));
end;



Writeln
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TIdTCPConnection.WriteLn(const AOut: string = '');
begin
  Write(AOut + EOL);
// Здесь:
//  LF = #10;
//  CR = #13;
//  EOL = CR + LF;
end;



Write
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TIdTCPConnection.Write(const AOut: string);
var
  LOutLen: Integer;
begin
  LOutLen := Length(AOut);
  if LOutLen > 0 then begin
    WriteBuffer(Pointer(AOut)^, LOutLen);
  end;
end; //Write



Ну и вот самое интересное: WriteBuffer().
WriteBuffer
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
procedure TIdTCPConnection.WriteBuffer(const ABuffer; AByteCount: Integer;
  const AWriteNow: boolean = false);
var
  LBuffer: TIdSimpleBuffer;
  nPos, nByteCount: Integer;
begin
  if (AByteCount > 0) and (@ABuffer <> nil) then begin
    // Check if disconnected
    CheckForDisconnect(True, True);
    if connected then begin
      if (FWriteBuffer = nil) or AWriteNow then begin
        LBuffer := TIdSimpleBuffer.Create; try
          LBuffer.WriteBuffer(ABuffer, AByteCount);
          if Assigned(Intercept) then begin
            LBuffer.Position := 0;
            Intercept.Send(LBuffer);
            AByteCount := LBuffer.Size;
          end;
          nPos := 1;
          repeat
            nByteCount := IOHandler.Send(PChar(LBuffer.Memory)[nPos - 1], LBuffer.Size - nPos + 1);
            FClosedGracefully := nByteCount = 0;
            // Check if other side disconnected
            CheckForDisconnect;
            // Check to see if the error signifies disconnection
            if GStack.CheckForSocketError(nByteCount, [ID_WSAESHUTDOWN, Id_WSAECONNABORTED, Id_WSAECONNRESET]) then begin
              DisconnectSocket;
              GStack.RaiseSocketError(GStack.LastError);
            end;
            // TODO - Have a AntiFreeze param which allows the send to be split up so that process
            // can be called more. Maybe a prop of the connection, MaxSendSize?
            TIdAntiFreezeBase.DoProcess(False);
            DoWork(wmWrite, nByteCount);
            nPos := nPos + nByteCount;
          until nPos > AByteCount;
        finally FreeAndNil(LBuffer); end;
      // Write Buffering is enabled
      end else begin
        FWriteBuffer.WriteBuffer(ABuffer, AByteCount);
        if (FWriteBuffer.Size >= FWriteBufferThreshhold) and (FWriteBufferThreshhold > 0) then begin
          // TODO: Maybe? instead of flushing - Write until buffer is smaller than Threshold.
          // That is do at least one physical send.
          FlushWriteBuffer(FWriteBufferThreshhold);
        end;
      end;
    end
    else
    begin
      raise EIdNotConnected.Create(RSNotConnected);
    end;
  end;
end;



...
Т.е., при отправлении блока строк (из объекта TStrings) сперва (возможно) отправляется количество строк.
Потом - каждая строка, дополненная cr+lf. В каждом "отправлении" (при вызове метода WriteBuffer) физически сперва передается длина блока данных, потом - сам блок.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711281
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, у меня 9 версия INDY.

авторВ каждом "отправлении" (при вызове метода WriteBuffer) физически сперва передается длина блока данных, потом - сам блок.

Вот только функция recv эту длину почему-то не видит, а выдает размер принятого пакета.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711286
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbВот только функция recv эту длину почему-то не видит

Ей это и не надо. Это функция транспортного уровня, она принимает простой поток байт. До
протоколов уровня приложения ей дела нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711306
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSergey_rbВот только функция recv эту длину почему-то не видит

Ей это и не надо. Это функция транспортного уровня, она принимает простой поток байт. До
протоколов уровня приложения ей дела нет.


Тогда должна быть другая функция, которая работает на уровне протокола.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711310
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbТогда должна быть другая функция, которая работает на уровне протокола.

Да. И это, внезапно, ReadStrings из INDY. Потому что протокол не зря называется "уровня
приложения".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711412
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияТ.е., при отправлении блока строк (из объекта TStrings) сперва (возможно) отправляется количество строк.
Потом - каждая строка, дополненная cr+lf. В каждом "отправлении" (при вызове метода WriteBuffer) физически сперва передается длина блока данных, потом - сам блок.
Осталось увидеть дамп принятого сообщения 21691688 и все станет понятно.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711423
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первое сообщение

автор607|192.168.96.204|Подключено|


Заканчивается переводом строки 13 10
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711425
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот это более правильное сообщение, заканчивается двумя переводами строки

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
|OnChangeState|1097|1204|
|OnChangeState|1176|1284|
|OnChangeState|1196|1303|
|OnChangeState|1204|1310|
|OnChangeState|1216|1323|
|OnChangeState|1259|1343|
|OnChangeState|1316|1403|
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711427
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSergey_rbТогда должна быть другая функция, которая работает на уровне протокола.

Да. И это, внезапно, ReadStrings из INDY. Потому что протокол не зря называется "уровня
приложения".


Никто и не просит функцию recv выдавать форматированный текст, ее задача вытащить все данные из сокета, с которой она справляется, но не всегда...
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711433
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbНикто и не просит функцию recv выдавать форматированный текст, ее задача вытащить все данные из сокета, с которой она справляется, но не всегда...
recv() работает совсем не так как ты ожидаешь.

PS Дамп будет 21691688 ?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711440
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rbНикто и не просит функцию recv выдавать форматированный текст, ее задача вытащить все данные из сокета, с которой она справляется, но не всегда...
recv() работает совсем не так как ты ожидаешь.

PS Дамп будет 21691688 ?

Я же выложил
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711451
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbЯ же выложил
Где result.bin ? Если ты думаешь что копипаст содержимого сообщений это то что мне интересно, то ты ошибаешься, ты скопипастил только ненужную инфу.
Надо все принятое с точностью до байта записать в файл, и файл сюда выложить.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711458
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rbЯ же выложил
Где result.bin ? Если ты думаешь что копипаст содержимого сообщений это то что мне интересно, то ты ошибаешься, ты скопипастил только ненужную инфу.
Надо все принятое с точностью до байта записать в файл, и файл сюда выложить.

Предварительно, я посмотрел HEX этого файла
Он заканчивается двумя переводами строк
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711540
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Котовасия...
Т.е., при отправлении блока строк (из объекта TStrings) сперва (возможно) отправляется количество строк.
Потом - каждая строка, дополненная cr+lf. В каждом "отправлении" (при вызове метода WriteBuffer) физически сперва передается длина блока данных, потом - сам блок.

А нафига ты такое исследование провёл, и так же очевидно было, что так должно было быть...
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711541
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbДа, у меня 9 версия INDY.

авторВ каждом "отправлении" (при вызове метода WriteBuffer) физически сперва передается длина блока данных, потом - сам блок.

Вот только функция recv эту длину почему-то не видит, а выдает размер принятого пакета.

Мля, ПОТОМУ ЧТО ТЫ ЕГО ЗАДАЁШЬ НА ВХОДЕ recv!
ЗАДАВАЙ БОЛЬШЕ! ОНО БУДЕТ ТЕБЕ ВЫДАВАТЬ БОЛЬШЕ!
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711543
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb ...

И если мне кто-то ещё посмеет возразить, что Pascal, Delphi неисправимо калечат людям мозг, то я просто дам ссылку на этот топик...
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711563
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivSergey_rbДа, у меня 9 версия INDY.

пропущено...


Вот только функция recv эту длину почему-то не видит, а выдает размер принятого пакета.

Мля, ПОТОМУ ЧТО ТЫ ЕГО ЗАДАЁШЬ НА ВХОДЕ recv!
ЗАДАВАЙ БОЛЬШЕ! ОНО БУДЕТ ТЕБЕ ВЫДАВАТЬ БОЛЬШЕ!

Насколько больше?
В два раза достаточно?
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711568
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivSergey_rb ...

И если мне кто-то ещё посмеет возразить, что Pascal, Delphi неисправимо калечат людям мозг, то я просто дам ссылку на этот топик...

Что доказывает поговорку:

авторопытный программист С++ с легкостью может решить проблему, не существующую в Delphi
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711576
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И подтверждает, что опытный программист Дельфи не может решить проблему, возникающую в Дельфи.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711580
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovИ подтверждает, что опытный программист Дельфи не может решить проблему, возникающую в Дельфи.


К счастью, я не опытный программист Дельфи, и, поэтому, у меня проблем в Дельфи не возникает.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711583
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbК счастью, я не опытный программист Дельфи, и, поэтому, у меня проблем в Дельфи не возникает.

Тогда зачем ты здесь пытаешься использовать recv() вместо ReadStrings() там?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711594
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSergey_rbК счастью, я не опытный программист Дельфи, и, поэтому, у меня проблем в Дельфи не возникает.

Тогда зачем ты здесь пытаешься использовать recv() вместо ReadStrings() там?


Потому что прога, написанная в Лазарусе, не работает под WinCe7.
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711601
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb у меня проблем в Дельфи не возникает.
Sergey_rbПотому что прога, написанная в Лазарусе, не работает под WinCe7.

Это либо не проблема, либо кто-то совсем не умеет в логику.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
recv выход из цикла
    #39711607
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSergey_rb у меня проблем в Дельфи не возникает.
Sergey_rbПотому что прога, написанная в Лазарусе, не работает под WinCe7.

Это либо не проблема, либо кто-то совсем не умеет в логику.


А вы в этом профи.

Только что-то никто из вас так и не написал функцию, получающую данные из сокета, не закрывая сокета.

Развели флуда на 5 страниц.
...
Рейтинг: 0 / 0
25 сообщений из 178, страница 5 из 8
Форумы / C++ [игнор отключен] [закрыт для гостей] / recv выход из цикла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]