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

 
 
> 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
 
Start new topic
Ответов
Цырен
сообщение Aug 20 2007, 12:51
Сообщение #2


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

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



Кажется я ответил себе как отследить состояние каждого соединения для того, чтобы реализовать множественное подключение к моему серверу.
Ответ был как всегда под руками и никаких дополнительных глобальных переменных, отслеживающих состояние сервера не надо. Ответ вот где:

struct uip_udp_conn {
uip_ipaddr_t ripaddr; /**< The IP address of the remote peer. */
u16_t lport; /**< The local port number in network byte order. */
u16_t rport; /**< The remote port number in network byte order. */
u8_t ttl; /**< Default time-to-live. */

/** The application state. */
uip_udp_appstate_t appstate;
};

typedef struct tftp_state uip_udp_appstate_t;

struct tftp_state {
u16_t opcode; /* Êîä îïåðàöèè */
u16_t block_id; /* Íîìåð áëîêà */
u8_t *data; /* Óêàçàòåëü íà äàííûå */
};

Делая так:
struct uip_udp_conn *tftp_conn; // некое UDP-соединение
tftp_conn = (struct uip_udp_conn*)uip_udp_conn;
имеем доступ к состоянию текущего UDP-соединения (из таблицы UDP-соединений):

tftp_conn->appstate.opcode -код операции, которую данное соед. совершает (дает читать или записывать)
tftp_conn->appstate.block_id -какой блок данных он дает читать/записывать
tftp_conn->appstate.data -указатель на данные с которыми сервер должен сделать что-либо(записать/прочитать блок в/из файл).

Кому интересно:

Причем текущее соединение устанавливается только если:
1. в таблице UDP-соединений есть хоть одна запись с локальным номером порта TFTP(69 или иной не равный 0)
2. UDP-датаграмма предназначена именно порту текущего соединения
3. Текущее соединение "узнает" номер порта удаленного хоста или видит его впервые, но готов пообщаться, т.к. rport=0(типа сервер свободен и готов к новой связи)
4. Текущее соединение "узнает" IP-адрес удаленного хоста или видит его впервые, но готов пообщаться, т.к. tipaddr=0.0.0.0.
(IP-адрес проверяет IP)

При входе в наш обработчик APP_CALL() (у меня это void tftp_appcall(void)) надо:
1. определить состояние флага uip_flags( либо UIP_POLL либо UIP_NEWDATA)
1.1. Если UIP_POLL, то проверить условие истечения таймаута
1.2. Если UIP_NEWDATA, то проверить для какого порта именно предназначен пакет:
1.2.1 Если для порта 69, то создать новое соединение tftp_conn = uip_udp_new(&ripaddr, rport) и
обработать запрос (ничего другого быть и не может).
1.2.2 Если для нашего(а это проверялось еше в uip_process()), тогда обработать данные или
подтверждение.

З.Ы. При закрытии соединения (удаления ее из таблицы UDP-соединений) обязательно обнулять поля ripaddr и rport.
З.Ы. При инициализации надо создавать UDP-соединение в таблице под номером порта 69.
void tftp_init(void)
{
uip_ipaddr_t addr;
struct uip_udp_conn *c;

uip_ipaddr(&addr, 0,0,0,0);
c = uip_udp_new(&addr, HTONS(0)); // Адрес и номер порта удаленного хоста нулевые.
if(c != NULL) {
uip_udp_bind(c, HTONS(69)); // Стандартный порт TFTP
}
}
Go to the top of the page
 
+Quote Post
Aprox
сообщение May 23 2008, 19:39
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131



Цитата(Цырен @ Aug 20 2007, 16:51) *
Кажется я ответил себе как отследить состояние каждого соединения для того, чтобы реализовать множественное подключение к моему серверу.


Как я понял, вам нужен UDP сервер? Только что закончил такую разработку и прекрасно обошелся без готовых uIP, в которых сам черт ногу сломит. Суть проста. -Принимаем пакет, адресованный серверу по МАС, по IP, и по номеру порта. Выделяем запрос, обрабатываем его и выдаем пакет ответа в хидере которого, стоят МАС клиента, IP-клиента, и порт запроса клиента. Все эти данные выделяются из хидера запроса. Таким образом, UDP-сервер откликается всякому клиенту, кто грамотно к нему обратился. И никаких таблиц соединений и прочей лабуды не требуется.

Кстати, скорость передачи потока данных в пакетах UDP размером 1.5К у меня на STR912FAW44 получилась 96 Мbit/s Получилась только потому, что никакого готового софта uIP не использовал.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Цырен   IP/UDP/TFTP uIP v1.0   Aug 10 2007, 11:31
- - e-yes   1. Не правильно понимаешь. Есть еще uip_app_regist...   Aug 12 2007, 11:09
- - etoja   Исходники прилагаю. Каким компилятором пользовалис...   Aug 13 2007, 04:04
|- - Цырен   2 etoja Спасибо, впервые вижу этот код, хотя всю ...   Aug 13 2007, 07:53
- - ig_z   Цитата(Цырен @ Aug 10 2007, 14:31) 1. Я т...   Aug 13 2007, 08:05
|- - Цырен   Цитата(ig_z @ Aug 13 2007, 12:05) Недокур...   Aug 13 2007, 08:15
|- - ig_z   Цитата(Цырен @ Aug 13 2007, 11:15) 2 ig_z...   Aug 14 2007, 08:29
- - e-yes   >Я нашел указанные файлы на старой версии сайта...   Aug 13 2007, 15:07
|- - Цырен   Цитата(e-yes @ Aug 13 2007, 19:07) ...   Aug 14 2007, 06:38
- - Цырен   2 ig_z Спасибо. Когда встанет вопрос о мультизадач...   Aug 14 2007, 10:25
- - Цырен   Я сделал так, чтобы на uIP работали сразу два серв...   Aug 16 2007, 11:26
- - etoja   TFTP гораздо проще, чем FTP. TFPT использует для д...   Aug 16 2007, 13:18
- - Цырен   Я почти близок к своей заветной цели. Я вот думаю ...   Aug 19 2007, 21:37
|- - zltigo   Цитата(Цырен @ Aug 20 2007, 00:37) RFC135...   Aug 19 2007, 21:54
|- - Цырен   Цитата(zltigo @ Aug 20 2007, 01:54) Полно...   Aug 20 2007, 09:47
|- - Usatyj   уважаемый Цырен! поможите исходничком, а? не п...   May 22 2008, 07:21
- - PoReX   Подскажите с UDP на uIP v1.0. Никак не получается ...   Feb 5 2013, 12:17
|- - scifi   Цитата(PoReX @ Feb 5 2013, 16:17) Может е...   Feb 5 2013, 15:08
|- - PoReX   Цитата(scifi @ Feb 5 2013, 19:08) Есть ра...   Feb 6 2013, 19:08
- - podelkin   а lwip слишком тяжел? По мне так продвинутее на по...   Feb 5 2013, 12:17
|- - PoReX   Цитата(podelkin @ Feb 5 2013, 16:17) а lw...   Feb 5 2013, 12:18
- - PoReX   Одна проблема решилась. Оказывается uip шлет udp с...   Feb 7 2013, 09:27
- - PoReX   Наконец я победил uip:) Как и думал проблема заклю...   Feb 7 2013, 10:55
- - ElectronicsLab   Добрый день. Что-то не получается у меня отправить...   Aug 20 2013, 10:31
|- - kolobok0   Цитата(ElectronicsLab @ Aug 20 2013, 14:3...   Aug 21 2013, 09:57
- - kramener   Цитата(PoReX @ Feb 7 2013, 14:55) Наконец...   Sep 20 2013, 11:45
|- - kramener   Только что сам разобрался с uIP ) Выложу код на вс...   Sep 20 2013, 13:46
- - Myrik   Мне бы вернутся к теме о двух серваках на uIP. Дел...   Apr 7 2014, 05:47


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

 


RSS Текстовая версия Сейчас: 30th July 2025 - 04:15
Рейтинг@Mail.ru


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