|
IP/UDP/TFTP uIP v1.0, uIP-шники отзовитесь. |
|
|
|
Aug 10 2007, 11:31
|

Частый гость
 
Группа: 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?
Спасибо за внимание.
|
|
|
|
|
 |
Ответов
|
Aug 20 2007, 12:51
|

Частый гость
 
Группа: 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 } }
|
|
|
|
|
May 23 2008, 19:39
|

Местный
  
Группа: Участник
Сообщений: 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 не использовал.
|
|
|
|
Сообщений в этой теме
Цырен 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|