Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: TCP ReadBytes Indy10  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 696
X-Cite, а на сервере не надо тогда отправку тоже в цикл заворачивать, если мы кусочками по 100 байт шлем?
6 авг 19, 11:33    [21942740]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1515
100 байт - это пример. В данном случае все сообщение....
Можно и 100 Мб отправить одним Write
Кусочками только принимаем...
6 авг 19, 11:35    [21942746]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 696
X-Cite, Получается вместо 100 на сервере я указываю свою длину массива байтов. Читаю ее клиентом и в цикле складываю его по кусочкам?
6 авг 19, 11:36    [21942750]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1515
dartveider13,
Я думаю в indy есть метод типа Client.ReadAll(Buf, sz); который будет ждать и читать сам внутри до тех пор пока не получит размер sz
6 авг 19, 11:43    [21942759]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1515
тогда код на клиенте свернется до
sz := Client.Read(4);
Client.ReadAll(Buf, sz);


Кстати на сервере надо делать также...
Где гарантия что переданные вами 10 байт, по дороге не разобьются на 2 части и не придут двумя сообщениями в 4 и 6 байт...
6 авг 19, 11:44    [21942761]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 696
X-Cite, ну да согласен. Сейчас будем копать...
6 авг 19, 11:47    [21942764]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 696
X-Cite, попробовал сделать так:
Сервер:
Acontext.Connections.Socket.Write(Length(Buffer), True); // Передает размер
Acontext.Connection.Socket.Write(Buffer, Length(Buffer), 0);


Клиент:
sz := IdTCPClient.Socket.ReadInt64();
IdTcpClient.Socket.ReadBytes(Buffer, sz, False);


Сваливается в Connection Closed Gracefully. В Буфере на сервере 3653 длина, а в sz приходит аж 1010792557... Чет то много
6 авг 19, 12:01    [21942781]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1515
Socket.Write(Length(Buffer), True); - сколько байт вы передаете здесь.
IdTCPClient.Socket.ReadInt64(); - столько байт надо читать здесь.
6 авг 19, 12:08    [21942788]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 696
X-Cite, здесь нельзя указать количество байт
6 авг 19, 12:16    [21942795]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
Василий 2
Member

Откуда:
Сообщений: 679
Дегтярев Евгений
Василий 2
Либо не изобретать велосипед с кубическими колесами и перейти на HTTP

на существующий rpc-like протокол, а что будет в качестве транспорта дело второстепенное

Не совсем. В HTTP есть уже все приколы с длиной ответа, поточность, если вдруг понадобится, стандартизация. Учитывая уровень знаний ТС, намного легче взять уже готовое и на его основе с небольшими доработками сваять нужный функционал
6 авг 19, 12:17    [21942798]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 696
Василий 2, да как то осталась только часть с получением ответа. Не хотелось бы из-за этого полностью менять подход.
6 авг 19, 12:24    [21942799]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 696
Ну вот вопрос решился. Немного надо будет конечно обработать всякие исключения, но получилось примерно так:

// Сервер
Socket.WriteLn(IntToStr(Length(Buffer))) // отправляем размер буфера
Socket.Write(Buffer, Length(Buffer), 0); // отправляем сам буфер

// На клиенте
sz := StrToInt(Socket.Readln()); // получили размер
Socket.ReadBytes(Buffer, sz, false) // получили буфер

// дальше его обработка


Спасибо всем за участе. Отдельное спасибо XCite
6 авг 19, 12:32    [21942811]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 863
Нужно учитывать, что метод Readln не выбрасывает исключение при ошибке таймаута, а возвращает пустую строку (хотя возможно разное поведение в разных версиях Indy10).
6 авг 19, 12:58    [21942837]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 863
Также нежелательно передавать большой объём данных одним блоком. Должно быть ограничение, например максимум 5 МБ. При приёме также желательно контролировать объём данных, принимаемых с клиента и если InputSize больше 5 МБ, то это может быть атакой на сервер из чужого ПО, в этом случае дочитываем буфер и рвём связь.
6 авг 19, 13:05    [21942848]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 696
DmSer, там не такие большие пакетики. В них XML-на.
6 авг 19, 13:10    [21942853]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
Дегтярев Евгений
Member

Откуда: Барнаул
Сообщений: 1635
dartveider13
Socket.WriteLn(IntToStr(Length(Buffer))) // отправляем размер буфера

sz := StrToInt(Socket.Readln()); // получили размер


все будет хорошо
6 авг 19, 13:17    [21942863]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 696
Дегтярев Евгений, ну это ответ на коленке. В реалии я конечно же оборачиваю все это дело в проверки и try
6 авг 19, 15:44    [21943042]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3298
Если бы ты пересылал строки, то инди бы само разбиралось с передачей. Ну а массивы байт придётся дополнительно обрабатывать
6 авг 19, 16:48    [21943106]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
Дегтярев Евгений
Member

Откуда: Барнаул
Сообщений: 1635
dartveider13,

if string(flag) == "true"
вспомнилось
6 авг 19, 16:51    [21943112]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1515
dartveider13
X-Cite, здесь нельзя указать количество байт


Socket.Write(Int32(Length(Buffer))); // передаем 4 байта т.к. есть метод procedure Write(AValue: Int32; AConvert: Boolean = True); overload;

sz := IdTCPClient1.Socket.ReadInt32() // читаем 4 байта


ну или так тоже можно
Socket.Write(ToBytes(Length(Bytes)), 4); // передаем 4 байта
sz := Socket.ReadInt32() // читаем 4 байта

А то какие-то извращения со строками.
6 авг 19, 18:28    [21943199]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
dartveider13
Member

Откуда: Омск
Сообщений: 696
X-Cite, о спасибо. Действительно извращение со строками
9 авг 19, 06:39    [21945258]     Ответить | Цитировать Сообщить модератору
 Re: TCP ReadBytes Indy10  [new]
Дегтярев Евгений
Member

Откуда: Барнаул
Сообщений: 1635
да неужели
9 авг 19, 07:42    [21945264]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Delphi Ответить