Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сокеты


Страницы:   1 2

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]

Данная строка приведена в качестве примера?
Проанализируйте сами возможность отправки данной строки...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо