реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> IP/UDP/TFTP uIP v1.0, uIP-шники отзовитесь.
Цырен
сообщение Aug 10 2007, 11:31
Сообщение #1


Частый гость
**

Группа: Validating
Сообщений: 184
Регистрация: 26-06-07
Из: Санкт-Петербург
Пользователь №: 28 714



Недавно поднял uIP 1.0 для своей платы с LPC2364. Реализовал на ней web сервер, потом - telnet. Документация потрясающая, все понятно. Но это все были стеки IP/TCP/, моя же техническая задача состоит в реализации IP/UDP/TFTP(modbus). Если кто имеет исходнички на UDP и TFTP, плиз, ПОДЕЛИТЕСЬ. А если кто-то, вообще, уже делал такую связку, то я буду несказанно рад взять и воспользоваться вашими плодами работы безо всяких угрызений совести blush.gif.
Попутно спрошу.
1. Я так понимаю, что в uIP есть возможность подключения нескольких соединений равно как и несколько портов, но последнее не означает, что в uIP можно врубить два сервака сразу, например, web сервер и telnet, поскольку существует только одно определение app_call, которое вызывается обработчиком событий TCP. Правильно я понимаю?
2. Могут ли одновременно работать TCP и UDP в uIP?

Спасибо за внимание.
Go to the top of the page
 
+Quote Post
e-yes
сообщение Aug 12 2007, 11:09
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 30
Регистрация: 16-06-07
Пользователь №: 28 483



1. Не правильно понимаешь. Есть еще uip_app_registration.[c|h].
2. Why not?

P.S. Интересует скорость... у нас с uIP - полная #опа. Пинги быстрые, но TCP тормозит страшно (скорость ~10-15 Мбит).
Go to the top of the page
 
+Quote Post
etoja
сообщение Aug 13 2007, 04:04
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952



Исходники прилагаю.
Каким компилятором пользовались?
Прикрепленные файлы
Прикрепленный файл  tftpnaive_1.3.1.tar.gz ( 37.73 килобайт ) Кол-во скачиваний: 374
 
Go to the top of the page
 
+Quote Post
Цырен
сообщение Aug 13 2007, 07:53
Сообщение #4


Частый гость
**

Группа: Validating
Сообщений: 184
Регистрация: 26-06-07
Из: Санкт-Петербург
Пользователь №: 28 714



2 etoja
Спасибо, впервые вижу этот код, хотя всю сетку облазил. Буду разбираться. Я пользуюсь IAR-ом 3.40.

2 e-yes
"1. Не правильно понимаешь. Есть еще uip_app_registration.[c|h]."
Странно, я не нашел файлы, которые вы указали. Если не сложно, можно пояснить теорию по их использованию и ссылочку на них дать?
Go to the top of the page
 
+Quote Post
ig_z
сообщение Aug 13 2007, 08:05
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551



Цитата(Цырен @ Aug 10 2007, 14:31) *
1. Я так понимаю, что в uIP есть возможность подключения нескольких соединений равно как и несколько портов, но последнее не означает, что в uIP можно врубить два сервака сразу, например, web сервер и telnet, поскольку существует только одно определение app_call, которое вызывается обработчиком событий TCP. Правильно я понимаю?


Недокурили доку smile.gif
Где то в доке есть пример как запускать два сервака вместе. У меня именно web сервер и telnet работали вместе. По памяти проверяешь порт и запускаешь нужное апп
Go to the top of the page
 
+Quote Post
Цырен
сообщение Aug 13 2007, 08:15
Сообщение #6


Частый гость
**

Группа: Validating
Сообщений: 184
Регистрация: 26-06-07
Из: Санкт-Петербург
Пользователь №: 28 714



Цитата(ig_z @ Aug 13 2007, 12:05) *
Недокурили доку smile.gif
Где то в доке есть пример как запускать два сервака вместе. У меня именно web сервер и telnet работали вместе. По памяти проверяешь порт и запускаешь нужное апп


Я полазил по зарубежным форумам и нашел следующую подсказку от автора uIP:
You can use a union, something like this:

typedef union {
struct app1_state a1;
struct app2_state a2;
struct app3_state a3;
} uip_tcp_appstate_t;


and access the state structures through appstate->a1.var1; and so forth. This way no extra memory is required.

Hope this helps,

/adam

Marc Lehmann wrote:

Hello everyone out there

I'm trying to build an application that has several features using uIP.
Each of that features has its own structure to store the application
state. And that's where the problems start. Of course it's not possible to
typedef more than one structure to be uip_tcp_appstate_t.

I tried the add-on module uip_app_registration, but it doesn't take care
of uip_tcp_state.

Any ideas? Is there any workaround? Of couse I could put all the
application states together into one huge structure, but I'd rather prefer
a "smart" solution. wink.gif

Thanks
Marc


--
Adam Dunkels, Swedish Institute of Computer Science


Буду следовать совету автора.

2 e-yes
Я нашел указанные файлы на старой версии сайта uIP

2 ig_z
Вы делали также? Если нет, то можно подробнее?

Сообщение отредактировал Цырен - Aug 13 2007, 08:38
Go to the top of the page
 
+Quote Post
e-yes
сообщение Aug 13 2007, 15:07
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 30
Регистрация: 16-06-07
Пользователь №: 28 483



>Я нашел указанные файлы на старой версии сайта uIP
Ну у меня они на локальном диске, уже не помню где бралsmile.gif
Но и без них подобную функциональность реализовать - не вопросsmile.gif

Так что насчет скорости у uIP?
Go to the top of the page
 
+Quote Post
Цырен
сообщение Aug 14 2007, 06:38
Сообщение #8


Частый гость
**

Группа: Validating
Сообщений: 184
Регистрация: 26-06-07
Из: Санкт-Петербург
Пользователь №: 28 714



Цитата(e-yes @ Aug 13 2007, 19:07) *
>
Так что насчет скорости у uIP?


Знаешь, в моей задаче скорость - не критичный параметр, поэтому я не интересовался, но скажу, что скорость в 10-15Мбит - это уже не плохо.
Go to the top of the page
 
+Quote Post
ig_z
сообщение Aug 14 2007, 08:29
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551



Цитата(Цырен @ Aug 13 2007, 11:15) *
2 ig_z
Вы делали также? Если нет, то можно подробнее?


Я делал по другому, как советовал автор.
Я не помню названия пдфки (я несколько пдф склеил для печати книжкой), но в ней есть раздел
"6.3 Di®erentiating between applications". Все идеи оттуда.

Ключевые моменты привожу ниже.

Из Main
Код
int main(void)
{
  uip_init();
  app_init();          

  uip_kos_input.RunDly(0);
  uip_kos_output.RunDly(0);
  uip_kos_arp.RunDly(0);
  OS.Start();
}


Из App
Код
void app_init()
{
...
  telnetd_init();
  http_uart_bridge_init();
}

void application()
{
    switch (uip_conn->lport)
    {
    case HTONS(IP_UART_PORT):
        http_uart_bridge_appcall();
        break;

    case HTONS(TELNET_PORT):
        telnetd_appcall();
        break;
        
    default:       /* Should never happen. */
        uip_abort();
        break;
    }
}


http_uart_bridge_appcall() и telnetd_appcall() - приложения верхнего уровня. В данном случае 2 сервера: мост уарт-тцпип и телнет. А начиналось с серверов нттп и телнет.
Go to the top of the page
 
+Quote Post
Цырен
сообщение Aug 14 2007, 10:25
Сообщение #10


Частый гость
**

Группа: Validating
Сообщений: 184
Регистрация: 26-06-07
Из: Санкт-Петербург
Пользователь №: 28 714



2 ig_z
Спасибо. Когда встанет вопрос о мультизадачности, воспользуюсь вашим советом и вспомню добрым словом.

Сижу и и прикручиваю свои нужны к uIP. Пока ищу место, откуда бы вставить свой tftp к UDP.
Пока я думаю как определить uip_udp_appstate_t и каким должен быть состав структуры tftp соединения...
Go to the top of the page
 
+Quote Post
Цырен
сообщение Aug 16 2007, 11:26
Сообщение #11


Частый гость
**

Группа: Validating
Сообщений: 184
Регистрация: 26-06-07
Из: Санкт-Петербург
Пользователь №: 28 714



Я сделал так, чтобы на uIP работали сразу два сервака!!! В моем случае - telnet и web
А сделал я вот что:
1. Создал файлики
multiapplication.h:
#ifndef __MULTIAPPLICATION_H__
#define __MULTIAPPLICATION_H__

#include "webserver.h"
#include "telnetd.h"

extern void application(void);


typedef union {
struct telnetd_state uip_tcp_telnet;
struct httpd_state uip_tcp_http;
} uip_tcp_appstate_t;

#endif /*__MULTIAPPLICATION_H__*/

, multiapplication.c:
#include "uip.h"
#include "webserver.h"
#include "telnetd.h"
#include "multiapplication.h"

void application(void)
{
switch (uip_conn->lport)
{
case HTONS(80):
httpd_appcall();
break;

case HTONS(23):
telnetd_appcall();
break;

default: /* Should never happen. */
uip_abort();
break;
}
}
2. Закоментил typedef-нги в telnetd.h и webserver.h соответственно
//typedef struct telnetd_state uip_tcp_appstate_t;
//typedef struct httpd_state uip_tcp_appstate_t;

3. Определил UIP_APPCALL как (старые определения удалил)

#ifndef UIP_APPCALL
#define UIP_APPCALL application
#endif

4. Инклудил multiapplication.h в uIP.c

Таким образом, можно вставлять в uIP серваки по различным портам скока хочешь(в пределах имеющихся на свете с учетом размера памяти в МК smile.gif

Но, вот такая байда, что-то я отошел от прямой задачи - портировать TFTP поверх IP/UDP.
Если кто что может полезное кинуть, сказать - прошу, я буду рад.

Сообщение отредактировал Цырен - Aug 16 2007, 11:37
Go to the top of the page
 
+Quote Post
etoja
сообщение Aug 16 2007, 13:18
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952



TFTP гораздо проще, чем FTP.
TFPT использует для доставки информации пакеты UDP и открыват при этом один порт. В TFTP нет авторизации через логин и пароль.
FTP использует для доставки информации протоколы TCP/IP, открывает два порта - один для команд, второй для данных, использует авторизацию через логин и пароль.
Go to the top of the page
 
+Quote Post
Цырен
сообщение Aug 19 2007, 21:37
Сообщение #13


Частый гость
**

Группа: Validating
Сообщений: 184
Регистрация: 26-06-07
Из: Санкт-Петербург
Пользователь №: 28 714



Я почти близок к своей заветной цели. Я вот думаю как организовать тайм-аут. Ведь у каждого нового подключения есть своя история (был ли подтвержден последний блок, сколько было попыток ретрансляции и еще что-нибудь). Помоему одной глобальной переменной не обойтись, как вы считаете, те, кто разбирался в TFTP?
Кстати пришлось много где поискать инфу по протоколу. RFC1350 (ftp://ftp.rfc-editor.org/in-notes/rfc1350.txt) - похоже единственный источник, давший полное представление о протоколе. Но по началу очень помогла ссылка http://andr.ru/lib/comp/net/tcpip/tcpip_il...ated/tcp15.html - очень доступным языком. Да и вообще на этом сайте есть все про протоколы.

Мысли вслух:
1. Интересно получается, для того, чтобы TFTP заработал надо инициализировать его, создав в таблице UDP-соединений соединение с параметрами ripaddr=0.0.0.0, rport=0 и lport=69 (ну там еще ttl есть, не понятно для чего он там для TFTP). TFTP постоянно прослушивает 69-й порт и когда появляется UDP-сообщение на наш IP и порт 69 (это запрос на чтение или запись: opcode=1или2), сервер должен создать в таблице UDP-соединений новое соединение по случайному номеру локального порта lport. В этой новой записи сохраняются даные об IP-адресе и номере порта удаленного хоста(ripaddr=x, rport=y), вытащенные из UDP-пакета. И сразуже происходит обработка пришедших данных, с последующим ответом (подтверждение на запись или посылка первого блока запрошенных данных). Т.о. в таблице UDP-соединений появляются две записи, одна - для ублажения нужд подключившегося клиента, вторая - для рецепшена возможных новых соединений. А о состоянии соединения будут отражать какие-нибудь глобальные переменные. Если так, то получается для каждого соединения нет индивидуальных данных о том, было ли подтверждение на прошлый блок или, например, сколько времени прошло с момента посылки последнего блока. А если соединений три, допустим, и в одном из них произошел разрыв. Что же, теперь все остальные соединения канут в лету? Как же быть? Создать структуру(struct) в которой будут все параметры состояния соединения и построить массив такого типа размером равным размеру массива UDP-соединений, чтобы потом ассоциировать каждый элемент такого массива состояний с соответствующим соединением?

2. TFTP должно само позаботиться о том как поправить UDP-заголовок. А точнее задать IP-адрес получателя, наш IP-адрес, порт получателя, наш порт в пакете сообщения и длину UDP-пакета с заголовком. А надо ли длину?

Сообщение отредактировал Цырен - Aug 19 2007, 21:41
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 19 2007, 21:54
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Цырен @ Aug 20 2007, 00:37) *
RFC1350 (ftp://ftp.rfc-editor.org/in-notes/rfc1350.txt) - похоже единственный источник, давший полное представление о протоколе.

Полное? А эти забыли еще почитать RFC 1785, ,RFC 2090, RFC 2347, RFC 2348, RFC 2349, если будете работать с продвинутыми клиентами.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Цырен
сообщение Aug 20 2007, 09:47
Сообщение #15


Частый гость
**

Группа: Validating
Сообщений: 184
Регистрация: 26-06-07
Из: Санкт-Петербург
Пользователь №: 28 714



Цитата(zltigo @ Aug 20 2007, 01:54) *
Полное? А эти забыли еще почитать RFC 1785, ,RFC 2090, RFC 2347, RFC 2348, RFC 2349, если будете работать с продвинутыми клиентами.


Это уже бег с препятствиями. А мне бы пока первые шаги освоить.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 16:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01488 секунд с 7
ELECTRONIX ©2004-2016