Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.04;
Скачать: CL | DM;

Вниз

Сокеты   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.037 c
1-1079246174
Sphinx
2004-03-14 09:36
2004.04.04
Popup Menu и его координаты


6-1074772532
Denis Popov
2004-01-22 14:55
2004.04.04
Сокеты


1-1079284537
$tranger
2004-03-14 20:15
2004.04.04
Помогите с переводчиком


14-1079055248
Думкин
2004-03-12 04:34
2004.04.04
С днем рождения! 12 марта.


14-1078458896
Рамиль
2004-03-05 06:54
2004.04.04
Вирусы