Форум: "Сети";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
ВнизСокеты Найти похожие ветки
← →
able © (2004-01-14 16:14) [0]Когда прога отправляет много сообщений они склеиваются
← →
Digitman © (2004-01-14 16:35) [1]именно так и должно быть. если речь идет о TCP
← →
Вася Пупкин © (2004-01-14 16:35) [2]А о чем вопрос?
← →
raidan © (2004-01-14 22:38) [3]Констатация факта.
← →
DeadMeat © (2004-01-14 23:20) [4]Удалено модератором
Примечание: Это у тебя шутка юмора такая?
← →
able © (2004-01-18 20:55) [5]упсс, извените, ув. Мастера, спешил, вопрос - Как собссно, сделать, шоб не склейвались?
← →
Эл © (2004-01-18 20:59) [6]Подозреваю что никак.. легче "разлепить" (разделитель - CR LF (#13#10), как понимаю)
← →
Rouse_ © (2004-01-18 22:54) [7]Наиболее предпочтителен в данном варианте (четкой структуризации как я понимаю не предвидится) будет разделитель...
В общих случаях я предпочитаю использовать в качестве оного #0
← →
Piter © (2004-01-19 00:56) [8]Если уж на то пошло, то сначала надо считывать длину строки. А потом соответственно этому считывать строку. А то вдруг в данных будет #0? Что тогда?
← →
Rouse_ © (2004-01-19 01:51) [9]Обычная корректировка отправки данных исправит все проблемы.
PS: Поражаюсь с людей ищущих проблемы....
← →
Piter © (2004-01-19 02:06) [10]>Rouse_
Какая корректировка? Вот тебе нужно передать строкуs:=#34#77#0#12#50
подумай, как будет работать твой алгоритм...
← →
Rouse_ © (2004-01-19 02:17) [11]Данная строка приведена в качестве примера?
Проанализируйте сами возможность отправки данной строки...
← →
DHDD (2004-01-19 06:02) [12]Используй IDtcp! Там соединение последовательное - без склеивания. Иначе с TCPSocket и т.п. - пиши size=9 aaasssddd; принимаешь - читай size=9, считываешь 9 байт и ждёшь следующего size.
← →
Verg © (2004-01-19 10:27) [13]Все верно.
Единственным возможным вариантом является разделители или маркеры. Явные или неявные.
Что такое явные:
Явные разделители основываются на специфике передаваемых данных. Т.е., например, текстовая (отображаемая) информация разделяется неотображаемыми (непечатными или нетекстовыми) символами. Нпример, #0, #13, #10 и т.п.
Что такое неявные:
По-сути - это "устройство" данных. Т.е. если, например логически данные (бинарные, не несущие явным образом текстовой информации) группируются в пакеты, то у пакетов всегда есть (должны быть) заголовки, в которых обязательно где-нибудь присутсвует поле содержащее длину всего логического пакета. Т.о., принимающая сторона, зная о формате пакета, всегда имеет информацию, что с одной стороны количесто принятых данных не может быть меньше размера заголовка пакета. С другой стороны, накопив каличество байт >= размеру заголовка, она может уже анализировать этот заголовок и определить таким образом размер всего пакета, т.е. установить себе неявный "маркер", выраженный в количестве принятых байт, после которого следует считать весь пакет принятым 100%-тно, а байты следующие "свыше" принадлежащими уже следующему пакетву (по крайней мере заголовку следующего пакета).
← →
Piter © (2004-01-19 16:12) [14]>Данная строка приведена в качестве примера?
да
>подумай, как будет работать твой алгоритм...
Думаю... придумал. Он будет работать так:
передающей стороне надо отправить#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. Соответственно, один байт информации потерян. Как ты будешь осуществлять корректировку, интересно? :)
← →
DeadMeat © (2004-01-19 16:25) [15]> Piter © (19.01.04 16:12)
А шо, в тексте не может быть знаков "<" и ">"...??
ИМХО, но всё же универсализация здесь не пройдёт... Надо учитывать специфику передаваемых данных, и в каждом случае использовать свои идентификаторы (разделители)...
Можно ещё передавать пакеты без заголовков, но с фиксированным размером. Тогда на принимающей стороне разбивку можно производить по размеру пакета...
Вообщем, см. Verg © (19.01.04 10:27)
← →
Digitman © (2004-01-19 16:26) [16]проблема, высосаная из пальца ... не более того
← →
Piter © (2004-01-19 16:45) [17]А шо, в тексте не может быть знаков "<" и ">"...??
МОЖЕТ. Но сначала идет заголовок пакета, а там кроме длины пакета ничего нету, а "<" и ">" это не цифры, поэтому их там не может быть. Ты хоть вник в то, что я написал?
← →
DeadMeat © (2004-01-19 17:16) [18]Ну уж извините... Просто запись типа "<5>"+#34#77#0#12#50 меня поставила в тупик...
← →
Rouse_ © (2004-01-19 17:55) [19]> [17] Piter © (19.01.04 16:45)
Еще раз повторяю, в тексте не может быть #0
Соответственно когда отправляется строка, принимающая сторона знает что #0 в любом случае будет разделителем...
В общемто я согласен с Digitman ©
← →
able © (2004-01-19 18:03) [20]уууу, не ребят, я имел в виду нет ли функции, которая распределяет пакеты?
← →
Digitman © (2004-01-19 18:44) [21]
> able
лыко-мочало - начинай сначала ...
что есть "пакет" по твоему мнению ?
← →
able © (2004-01-19 19:00) [22]Нусссс, конечно спасибо за советы, но я всё же представлю всё, что я надумал. Кусок, где происходит заваливающая отправка пакетов - собссно движения мыши. Мышь двинулась - данные об её состоянии отправились, ессно, если за компом работает не тормоз, удалённая банка(и) взорвётся сообщениями об ошибке (try..except не катит).
Пример 1. Грызун двинулся - mousemove!&!123<1>821 - отправилось. Как вы понимаете, "!&!" - разделитель между параметрами и командой - "<1>, <2>...<45> - разделитель параметров".
Грызун двинулся ещё раз 20, уже вместо "mousemove!&!123<1>821 , mousemove!&!124<1>822" принимается - "2mousemove!&!123<1>821mo", то есть склеивается и с предъидущими и со следующими.
Была мысль, что бы сервер ждал ответа, что на удалённой банке двинулась мышь и всё ок, но моя прога рассчитана на более 10 компов, ессно сеть в даун, как же я буду говорить, об преймуществе в скорости?
ЗЫ. Вариант с параметром - размером команды ещё не пробовал, но теоретически всё наверное будет.
ЗЗЫ. Мои мысли.
Спасибо всем.
← →
Piter © (2004-01-19 19:06) [23]Rouse_ © (19.01.04 17:55) [19]
>Еще раз повторяю
начнем с того, что ты это первый раз говоришь
>в тексте не может быть #0
А при чем здесь текст? Мы говорим о передаче данных. Если твой алгоритм способен передавать только текст (текстовый файл) - то так и говори. А я говорю о передаче любых байтов данных
← →
able © (2004-01-19 19:06) [24]//Digitman ©
Блинн, ну команда, сообщение, текст отправлялась и клиентсокет ставил в очередь всё это дело!!!!!
← →
Rouse_ © (2004-01-19 20:02) [25]> [23] Piter © (19.01.04 19:06)
Ну во первых, мы говорим про передачу сообщений а не данных... (смотрим сабж)
Поэтому раз я сказал проанализировать возможность отправки сообщения с #0 то значит во второй раз я уже повторяю...
При передаче данных (именно данных) тут я с тобой согласен, что можно предварять отправку очередной порции маркером объема...
← →
Rouse_ © (2004-01-19 20:13) [26]> [24] able © (19.01.04 19:06)
Нет такой функции...
← →
Piter © (2004-01-19 22:10) [27]Rouse_
ну и я с тобой согласен. Просто мы неоднозначно понимаем
>Когда прога отправляет много сообщений
Для меня не очевидно, что сообщение - это текст. Смотря какое сообщение... вот текстовое сообщени - это текст :)
← →
Digitman © (2004-01-20 08:53) [28]
> able © (19.01.04 19:06) [24]
поток сообщений, передаваемых между клиентом и сервером, должен содкржать либо структуры фиксированных (заранее известных и клиенту и серверу) размеров либо (если протокол инф.обмена не предусматривает передачу таких структур) отделяться неким предопределенным разделителем (например, символ #0 в случае передачи текстовых сообщений произвольной длины)
в случае передачи некоей заранее неизвестной принимающей стороне произвольной последовательности байт (текстовые сообщения вполне сообтвествуют этому) можно каждое такое сообщение при передаче предварять префиксом фикс.размера, информирующим принимающую сторону о полном размере следующего за префиксом сообщения
← →
Piter © (2004-01-24 17:41) [29]Вот блин, то Digitman говорит
>проблема, высосаная из пальца ... не более того
То подробно разъясняет то, о чем мы с Rouse_ толкуем
← →
FireMan_Alexey © (2004-01-26 09:58) [30]Народ можно сделать так:
Packet_Type=Record
Size :Integer; //его длина
P_Type:Byte; //тип пакета
End;
Отсылается запись с длиной пакета и его типом, а после отсылается данные, на другой стороне принимается пакет запись
постоянной длины а далее ожидается приход данных!
Согласен с Digitman, проблема высосана из пальца.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.026 c