Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.53 MB
Время: 0.032 c
1-1079343040
Jager
2004-03-15 12:30
2004.04.04
Как заставить программу запускаться при закгузке в защ. режиме


14-1077491088
Soft
2004-02-23 02:04
2004.04.04
Святая вера в науку!!!


3-1078414734
ser k
2004-03-04 18:38
2004.04.04
Написал прогу с использыванием (ADOConnection, DataSet, ADOTable


7-1074653880
msgipss
2004-01-21 05:58
2004.04.04
Узнать, установлен ли на компьютере Web Server ?


11-1056511674
SPeller
2003-06-25 07:27
2004.04.04
TKOLHttp





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский