![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сокеты
able © (2004-01-14 16:14:00)Когда прога отправляет много сообщений они склеиваются
FireMan_Alexey (2004-01-26 09:58:00) [1]Народ можно сделать так:
Packet_Type=Record
Size :Integer; //его длина
P_Type:Byte; //тип пакета
End;
Отсылается запись с длиной пакета и его типом, а после отсылается данные, на другой стороне принимается пакет запись
постоянной длины а далее ожидается приход данных!
Согласен с Digitman, проблема высосана из пальца.
Piter (2004-01-24 17:41:00) [2]Вот блин, то Digitman говорит
>проблема, высосаная из пальца ... не более того
То подробно разъясняет то, о чем мы с Rouse_ толкуем
Digitman (2004-01-20 08:53:00) [3]
> able © (19.01.04 19:06) [24]
поток сообщений, передаваемых между клиентом и сервером, должен содкржать либо структуры фиксированных (заранее известных и клиенту и серверу) размеров либо (если протокол инф.обмена не предусматривает передачу таких структур) отделяться неким предопределенным разделителем (например, символ #0 в случае передачи текстовых сообщений произвольной длины)
в случае передачи некоей заранее неизвестной принимающей стороне произвольной последовательности байт (текстовые сообщения вполне сообтвествуют этому) можно каждое такое сообщение при передаче предварять префиксом фикс.размера, информирующим принимающую сторону о полном размере следующего за префиксом сообщения
Piter (2004-01-19 22:10:00) [4]Rouse_
ну и я с тобой согласен. Просто мы неоднозначно понимаем
>Когда прога отправляет много сообщений
Для меня не очевидно, что сообщение - это текст. Смотря какое сообщение... вот текстовое сообщени - это текст :)
Rouse_ (2004-01-19 20:13:00) [5]> [24] able © (19.01.04 19:06)
Нет такой функции...
Rouse_ (2004-01-19 20:02:00) [6]> [23] Piter © (19.01.04 19:06)
Ну во первых, мы говорим про передачу сообщений а не данных... (смотрим сабж)
Поэтому раз я сказал проанализировать возможность отправки сообщения с #0 то значит во второй раз я уже повторяю...
При передаче данных (именно данных) тут я с тобой согласен, что можно предварять отправку очередной порции маркером объема...
able (2004-01-19 19:06:00) [7]//Digitman ©
Блинн, ну команда, сообщение, текст отправлялась и клиентсокет ставил в очередь всё это дело!!!!!
Piter (2004-01-19 19:06:00) [8]Rouse_ © (19.01.04 17:55) [19]
>Еще раз повторяю
начнем с того, что ты это первый раз говоришь
>в тексте не может быть #0
А при чем здесь текст? Мы говорим о передаче данных. Если твой алгоритм способен передавать только текст (текстовый файл) - то так и говори. А я говорю о передаче любых байтов данных
able (2004-01-19 19:00:00) [9]Нусссс, конечно спасибо за советы, но я всё же представлю всё, что я надумал. Кусок, где происходит заваливающая отправка пакетов - собссно движения мыши. Мышь двинулась - данные об её состоянии отправились, ессно, если за компом работает не тормоз, удалённая банка(и) взорвётся сообщениями об ошибке (try..except не катит).
Пример 1. Грызун двинулся - mousemove!&!123821 - отправилось. Как вы понимаете, "!&!" - разделитель между параметрами и командой - ", ... - разделитель параметров".
Грызун двинулся ещё раз 20, уже вместо "mousemove!&!123821 , mousemove!&!124822" принимается - "2mousemove!&!123821mo", то есть склеивается и с предъидущими и со следующими.
Была мысль, что бы сервер ждал ответа, что на удалённой банке двинулась мышь и всё ок, но моя прога рассчитана на более 10 компов, ессно сеть в даун, как же я буду говорить, об преймуществе в скорости?
ЗЫ. Вариант с параметром - размером команды ещё не пробовал, но теоретически всё наверное будет.
ЗЗЫ. Мои мысли.
Спасибо всем.
Digitman (2004-01-19 18:44:00) [10]
> able
лыко-мочало - начинай сначала ...
что есть "пакет" по твоему мнению ?
able (2004-01-19 18:03:00) [11]уууу, не ребят, я имел в виду нет ли функции, которая распределяет пакеты?
Rouse_ (2004-01-19 17:55:00) [12]> [17] Piter © (19.01.04 16:45)
Еще раз повторяю, в тексте не может быть #0
Соответственно когда отправляется строка, принимающая сторона знает что #0 в любом случае будет разделителем...
В общемто я согласен с Digitman ©
DeadMeat (2004-01-19 17:16:00) [13]Ну уж извините... Просто запись типа '<5>'+#34#77#0#12#50меня поставила в тупик...
Piter (2004-01-19 16:45:00) [14]А шо, в тексте не может быть знаков '<' и '>'...??
МОЖЕТ. Но сначала идет заголовок пакета, а там кроме длины пакета ничего нету, а '<' и '>' это не цифры, поэтому их там не может быть. Ты хоть вник в то, что я написал?
Digitman (2004-01-19 16:26:00) [15]проблема, высосаная из пальца ... не более того
DeadMeat (2004-01-19 16:25:00) [16]> Piter © (19.01.04 16:12)
А шо, в тексте не может быть знаков '<' и '>'...??
ИМХО, но всё же универсализация здесь не пройдёт... Надо учитывать специфику передаваемых данных, и в каждом случае использовать свои идентификаторы (разделители)...
Можно ещё передавать пакеты без заголовков, но с фиксированным размером. Тогда на принимающей стороне разбивку можно производить по размеру пакета...
Вообщем, см. Verg © (19.01.04 10:27)
Piter (2004-01-19 16:12:00) [17]>Данная строка приведена в качестве примера?
да
>подумай, как будет работать твой алгоритм...
Думаю... придумал. Он будет работать так:
передающей стороне надо отправить#34#77#0#12#50
Она вычисляет длину этого пакета - длина будет 5. Она в заголовке пакета пишет длину: 5. В простейшем случае отправляется нечто того: '<5>'+#34#77#0#12#50
Принимающая сторона ищет между '<' и '>' длину пакета. Между '<' и '>' заключена цифра 5. Соответственно, длина пакета будет 5. Она считывает следующие 5 байт (это будет #34#77#0#12#50) и потом опять начинает искать '<>', чтобы определить длину следующего пакета. Все просто, не так ли?
Rouse_, а вот ты не привел свой алгоритм.
Думаю, он таков. Просто берется и отсылается #34#77#0#12#50.
Принимающая сторона считает #34#77, потом откинет #0 как разделитель и потом примет #12#50. Соответственно, один байт информации потерян. Как ты будешь осуществлять корректировку, интересно? :)
Verg (2004-01-19 10:27:00) [18]Все верно.
Единственным возможным вариантом является разделители или маркеры. Явные или неявные.
Что такое явные:
Явные разделители основываются на специфике передаваемых данных. Т.е., например, текстовая (отображаемая) информация разделяется неотображаемыми (непечатными или нетекстовыми) символами. Нпример, #0, #13, #10 и т.п.
Что такое неявные:
По-сути - это "устройство" данных. Т.е. если, например логически данные (бинарные, не несущие явным образом текстовой информации) группируются в пакеты, то у пакетов всегда есть (должны быть) заголовки, в которых обязательно где-нибудь присутсвует поле содержащее длину всего логического пакета. Т.о., принимающая сторона, зная о формате пакета, всегда имеет информацию, что с одной стороны количесто принятых данных не может быть меньше размера заголовка пакета. С другой стороны, накопив каличество байт >= размеру заголовка, она может уже анализировать этот заголовок и определить таким образом размер всего пакета, т.е. установить себе неявный "маркер", выраженный в количестве принятых байт, после которого следует считать весь пакет принятым 100%-тно, а байты следующие "свыше" принадлежащими уже следующему пакетву (по крайней мере заголовку следующего пакета).
DHDD (2004-01-19 06:02:00) [19]Используй IDtcp! Там соединение последовательное - без склеивания. Иначе с TCPSocket и т.п. - пиши size=9 aaasssddd; принимаешь - читай size=9, считываешь 9 байт и ждёшь следующего size.
Rouse_ (2004-01-19 02:17:00) [20]Данная строка приведена в качестве примера?
Проанализируйте сами возможность отправки данной строки...