|
TCP или UDP?, Подскажите способ реализации |
|
|
|
Dec 28 2007, 06:36
|
Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687

|
Поздравляю всех с наступающими праздниками!!! А вопрос у меня такой. Есть классическая ситуация - некоторое устройство управляется компом по сети, причем находятся они в одной локалке, т.е. все быстро и условно надежно. Устройство получает от компа команды, возвращает результаты замеров, статусы и проч. Встает вопрос что использовать: TCP или UDP? В пользу TCP говорит тот факт, что не надо проверять доставку (а иногда важная команда должна быть обязательно доставлена, причем выполнена только один раз). Тут появляется большое "но". Фактически, те данные, которые я буду передавать (например, команды) - это пакеты. Т.е. явная пакетная передача данных. А TCP потоковый! Он мне даже не скажет, где одна команда закончилась и новая началась. Т.е. мне надо вводить некий механизм синхронизации чтобы отлавливать начало очередного пакета. Первое что в голову приходит - самому на своем уровне добавлять в пакет его длину. Но если одна из сторон хоть раз ошибется или сетка сглючит и длина пакета окажется неправильной, то я никогда уже не поймаю начало очередного пакета. Можно вместо длины (или вместе с ней) пометить сигнатурой начало пакета, а в самом пакете делать байт-стаффинг чтобы она там не повторилась. Не нравится - как-то тяжеловесно получается. Можно сделать по UDP, но там придется городить подтверждение доставки и контроль на недублирование пакетов. Тоже гемор. Короче, варианты решения я вижу, но все они мне не нравятся. Мне кажется, что есть какое-то простое и красивое решение, а я заблудился в трех соснах. Т.к. ситуация классическая для большинства встроенных систем, поделитесь плз опытом, кто как решает подобные задачи.
|
|
|
|
|
 |
Ответов
|
Jan 13 2008, 12:31
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата На телнет неделю? Об этом - чуть ниже, не Вы один тут удивляетесь  Цитата Предлагаете сниффер как универсальное средство отладки и мониторинга межприборного взаимодействия Как одно из необходимых средств - конечно. А также надо использовать хотя-бы отладчики для ускорения процесса. Цитата Или быстренько изучить работу с сокетами и под любую задачу лихо писать программку на С? Ага, вы предлагает вообще не изучать ничего и гнать данные в текстовом виде? Глубину этого заблуждения я сейчас постараюсь продемонстрировать. Вам и Kirill Frolov'у, который Цитата Я б вам не доверил. Не неделю. Пол-часа. Давайте посмотрим, как будет выглядеть вариант с передачей бинарных данных и с передачей в виде ascii-строк. Допустим, у нас есть набор переменных v1, v2 ... vn, которые надо передать в другой софт на другом компе через сеть используя TCP/IP Мой вариант (конечно, все условно) Код //Передача
stuct { long v1; float v2; .... short v3; }VARS;
...
if (send(sock,&VARS,sizeof(VARS),0)!=sizeof(VARS)) { //Ошибка .... }
//Прием
stuct { long v1; float v2; .... short v3; }VARS;
...
int res; if (ioctlsocket(sock,FIONREAD,&res)) //Вариант для винды { //Ошибка } if (res<sizeof(VARS)) { //Еще нет достаточного количества данных } if (recv(sock,&VARS,sizeof(VARS),0)!=sizeof(VARS)) { //Ошибка } Есть небольшая тонкость, связаная с выравниваем полей в структурах, это решается при помощи #pragma pack(1). Теперь посмотрим, что надо сделать для работы с ascii Код //Передача
char s[100]; int l; sprintf(s,"%d %d %d\r\n",v1,v2,...); l=strlen(s); if (send(sock,s,l,0)!=l { //Ошибка } А вот в приеме все не так банально. Надо делать весьма хитрую процедуру, которая будет выполнять построчное чтение в буфер строки из сокета (т.е. сначала она будет читать в какой-то фиксированый буфер, а затем перекладывать данные в буфер строки), обязательно следить, не выйдет ли строка за размеры буфера (любители не выполнять таких проверок как раз и занимаются регулярным отловом узких мест и выпуском патчей на свой софт), далее при помощи sscanf или другим способом мы вытаскиваем нужные нам переменные. Если мой вариант работоспособен сразу, то вариант со строками еще надо правильно написать и отладить. Не говоря уже о том, что легко допустить ошибку, приводящую к возможности переполнения буферов со всеми вытекающими последствиями. Теперь обратим внимание на то, что у автора в приборе стоит весьма маленький по ресурсам камень. Напомню, что formatted_write с поддержкой плавающей запятой - килобайт под 8, и еще ему нужен огромный размер стека. Если надо будет разбирать числа при приеме, то sscanf - тоже весьма немалая процедура. Вот отсюда, кстати, и растут ноги упомянутого мной членомерства. Так сколько времени человек будет делать это все? За неделю, я думаю, как раз справится. Так что, господа - любители телнета, тут вы погорячились. Пока что прозвучала только одна здравая идея (и я с ней мало того, что согласен, еще и стараюсь пользовать в меру возможностей) - это полностью избавиться от софта на верхнем уровне, переложив все на браузер. Но тут требуются намного большие ресурсы проца в приборе. Цитата Да Вы просто в душе хакер! А Вы завидуете черной завистью?
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jan 13 2008, 17:47
|

Частый гость
 
Группа: Новичок
Сообщений: 111
Регистрация: 10-02-07
Из: St.Petersburg, Russia
Пользователь №: 25 241

|
Цитата(Rst7 @ Jan 13 2008, 15:31)  Допустим, у нас есть набор переменных v1, v2 ... vn, которые надо передать в другой софт на другом компе через сеть используя TCP/IP Мой вариант (конечно, все условно) Код //Передача stuct { long v1; float v2; .... short v3; }VARS;
...
if (send(sock,&VARS,sizeof(VARS),0)!=sizeof(VARS)) { //Ошибка Угу. Ошибка. Такое в реальной жизни не работает. Начать можно хоть с man xdr(3) Цитата Код if (recv(sock,&VARS,sizeof(VARS),0)!=sizeof(VARS)) { //Ошибка } Есть небольшая тонкость, связаная с выравниваем полей в структурах, это решается при помощи #pragma pack(1). Ещё небольшая тонкость с sizeof(), разными прагмами/атрибутами в разных компиляторах, порядко байтов, размером базовых типов... ЭТО НЕ РАБОТАЕТ в обще случаем. Частноости (win32<->win32) не интересны. Цитата А вот в приеме все не так банально. Надо делать весьма хитрую процедуру, которая будет выполнять построчное чтение в буфер строки из сокета (т.е. сначала она будет читать в какой-то фиксированый буфер, а затем перекладывать данные в буфер строки), обязательно следить, не выйдет ли строка за размеры буфера (любители не выполнять таких проверок как раз и занимаются регулярным отловом узких мест и выпуском патчей на свой софт), Бред. Тривиальный автомат. Если допустима блокировка на чтении, то возможно делать просто fscanf(). Про lex вы тоже не в курсе... Цитата Не говоря уже о том, что легко допустить ошибку, приводящую к возможности переполнения буферов со всеми вытекающими последствиями. Между /можно допустить/ и *уже* *не* *работает* -- гигантская пропасть. Допустить ошибку можно практически везде. Цитата Теперь обратим внимание на то, что у автора в приборе стоит весьма маленький по ресурсам камень. tcp/ip стек на порядок тяжелее printf'а. Цитата Напомню, что formatted_write с поддержкой плавающей запятой - килобайт под 8, В приличной libc можно подключить версию без плавающей точки. Цитата и еще ему нужен огромный размер стека. Аж полсотни байт! Цитата Если надо будет разбирать числа при приеме, то sscanf - тоже весьма немалая процедура. Для тех кому очень неймётся есть atoi(3)... А вот itoa -- экзотика. Цитата Вот отсюда, кстати, и растут ноги упомянутого мной членомерства. Так сколько времени человек будет делать это все? За неделю, я думаю, как раз справится. Неплохо, если за неделю. А сколько он будет самодельные велосипеды вместо библиотечных функций изобретать и отлаживать? Цитата А Вы завидуете черной завистью?  Нет. Я думаю, я зря трачу своё время на бесполезные споры.
--------------------
[ZX]
|
|
|
|
Сообщений в этой теме
gladov TCP или UDP? Dec 28 2007, 06:36 Postoroniy_V Цитата(gladov @ Dec 28 2007, 15:36) Поздр... Dec 28 2007, 07:57 gladov Цитата(Postoroniy_V @ Dec 28 2007, 10:57)... Dec 29 2007, 21:35  Postoroniy_V Цитата(gladov @ Dec 30 2007, 06:35) Это з... Dec 30 2007, 05:37  tag Цитата(gladov @ Dec 30 2007, 00:35) Читал... Jan 10 2008, 07:36   gladov Цитата(tag @ Jan 10 2008, 10:36) ...есть ... Jan 10 2008, 10:56 Rst7 ЦитатаНо если одна из сторон хоть раз ошибется или... Dec 28 2007, 08:18 tag ...вы противоречите сами себе. Если TCP гарантируе... Dec 28 2007, 08:28 iosifk Цитата(gladov @ Dec 28 2007, 09:36) Поздр... Dec 28 2007, 09:30 KRS Цитата(gladov @ Dec 28 2007, 09:36) А TCP... Dec 28 2007, 11:20 Rst7 ЦитатаПорядок безусловно будет соблюден, но кто га... Dec 30 2007, 12:54 Aprox Может, я чего-то не понимаю в тонкостях задачи, но... Jan 9 2008, 12:23 Rst7 Цитата(Aprox @ Jan 9 2008, 14:23) Может, ... Jan 10 2008, 06:44  vvs157 Цитата(Rst7 @ Jan 10 2008, 09:44) Это хор... Jan 10 2008, 12:03   Rst7 Цитата(vvs157 @ Jan 10 2008, 14:03) Испол... Jan 10 2008, 12:39    vvs157 Цитата(Rst7 @ Jan 10 2008, 15:39) Вот тут... Jan 10 2008, 16:58  Aprox Цитата(Rst7 @ Jan 10 2008, 09:44) Это хор... Jan 10 2008, 17:17 Rst7 ЦитатаВопрос традиций
Вот и я думаю, зачем челове... Jan 11 2008, 06:28 vvs157 Цитата(Rst7 @ Jan 11 2008, 09:28) Вот и я... Jan 11 2008, 12:20  Rst7 Цитата(vvs157 @ Jan 11 2008, 14:20) Весьм... Jan 11 2008, 12:39   gladov Цитата(Rst7 @ Jan 11 2008, 15:39) Давай м... Jan 11 2008, 20:56    vvs157 Цитата(gladov @ Jan 11 2008, 23:56) Полно... Jan 11 2008, 21:37    Kirill Frolov Цитата(gladov @ Jan 11 2008, 23:56) Полно... Jan 12 2008, 08:46    Aprox Цитата(gladov @ Jan 11 2008, 23:56) Полно... Jan 14 2008, 08:36     blackfin Цитата(Aprox @ Jan 14 2008, 11:36) ... до... Jan 14 2008, 08:52      Aprox Цитата(blackfin @ Jan 14 2008, 11:52) Ага... Jan 14 2008, 10:48 Aprox Цитата(Rst7 @ Jan 11 2008, 09:28) HTML ст... Jan 11 2008, 13:45 Kirill Frolov Цитата(gladov @ Dec 28 2007, 09:36) В пол... Jan 11 2008, 14:01 Rst7 ЦитатаКогда начинаются разговоры, о том дескать, ч... Jan 12 2008, 09:31 vvs157 Цитата(Rst7 @ Jan 12 2008, 12:31) А может... Jan 12 2008, 21:36 Kirill Frolov Цитата(Rst7 @ Jan 12 2008, 12:31) Я тоже ... Jan 13 2008, 08:20 blackfin Цитата(Kirill Frolov @ Jan 11 2008, 17:01... Jan 12 2008, 09:36 vvs157 Цитата(Rst7 @ Jan 13 2008, 15:31) А Вы за... Jan 13 2008, 21:00 Rst7 ЦитатаУгу. Ошибка. Такое в реальной жизни не работ... Jan 13 2008, 18:35 Rst7 Цитатагадить потребителю тоже не подобает серьезны... Jan 14 2008, 06:32 Rst7 ЦитатаНа "низшей меге" реализовать полно... Jan 14 2008, 09:09 blackfin Цитата(Rst7 @ Jan 14 2008, 12:09) Ну это ... Jan 14 2008, 09:52 GL_basik Вставлю свои 5 копеек.... Если надо бытро и легко ... Jan 17 2008, 10:07 Aprox Цитата(GL_basik @ Jan 17 2008, 13:07) Вст... Jan 17 2008, 16:12  Dog Pawlowa Без рассмотрения:
- структуры прибора
- объема пе... Jan 17 2008, 16:35  blackfin Цитата(Aprox @ Jan 17 2008, 19:12) По это... Jan 17 2008, 16:52   Aprox Цитата(blackfin @ Jan 17 2008, 19:52) Сра... Jan 18 2008, 08:21    blackfin Цитата(Aprox @ Jan 18 2008, 11:21) Необхо... Jan 18 2008, 09:01     Aprox Цитата(blackfin @ Jan 18 2008, 12:01) При... Jan 18 2008, 16:13      blackfin Цитата(Aprox @ Jan 18 2008, 19:13) Делаю ... Jan 19 2008, 10:38       Aprox Цитата(blackfin @ Jan 19 2008, 13:38) Нов... Jan 20 2008, 16:29 Rst7 ЦитатаПо этой причине, конструкторам малых систем... Jan 17 2008, 16:27 GL_basik Если есть время сначала создавать устройство, пото... Jan 18 2008, 09:09 Rst7 Цитатано ограничение на максимальное кол-во хостов... Jan 19 2008, 13:46 blackfin Цитата(Rst7 @ Jan 19 2008, 16:46) Это отк... Jan 19 2008, 17:23 Rst7 ЦитатаА что, существуют switch'и на большее чи... Jan 19 2008, 18:27 prottoss Привет всем!
Прочитал в теме про упоминание A... Feb 8 2008, 13:22 Aprox Цитата(prottoss @ Feb 8 2008, 16:22) Прив... Feb 9 2008, 15:04  Aprox Цитата(Aprox @ Feb 9 2008, 18:04) Я польз... Feb 10 2008, 08:13   prottoss Цитата(Aprox @ Feb 10 2008, 15:13) дабы н... Feb 10 2008, 09:21 Rst7 ЦитатаВозможно у кого нибудь есть наработки по это... Feb 8 2008, 13:42 prottoss Цитата(Rst7 @ Feb 8 2008, 20:42) Наработо... Feb 8 2008, 13:51 prottoss Все оказалось на много проще, чем я думал....пока ... Feb 8 2008, 15:46 Rst7 ЦитатаКогда все отработаю, естественно встанет воп... Feb 10 2008, 13:00
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|