uIP 1.0
|
/** * \addtogroup helloworld * @{ */ /** * \file * Пример, как писать приложения uIP, используя * протосокеты. * \author * Adam Dunkels <adam@sics.se> */ /* * Это короткий пример, как писать приложения uIP, используя * протосокеты. */ /* * Мы задаем состояние приложения (struct hello_world_state) в файле * hello-world.h, поэтому здесь его нужно подключить. Мы также подключаем * uip.h (так как он не может быть подключен в hello-world.h) и * <string.h>, так как нам нужна функция memcpy(). */ #include "hello-world.h" #include "uip.h" #include <string.h> /* * Декларация protosocket-функции которая обрабатывает соединение * (её код определен в конце модуля). */ static int handle_connection(struct hello_world_state *s); /*---------------------------------------------------------------------------*/ /* * Функция инициализации. Мы должны явно вызвать эту функцию их кода * инициализации системы, немного после вызова uip_init(). */ void hello_world_init(void) { /* Мы запускаем прослушивание соединений на порту 1000 TCP. */ uip_listen(HTONS(1000)); } /*---------------------------------------------------------------------------*/ /* * В файле hello-world.h есть определение макроса UIP_APPCALL для * hello_world_appcall, так что эта функция является функцией приложения uIP. * Эта функция будет вызвана при любом событии uIP (например, установлено * новое соединение, пришли новые данные, отправленные данные были * подтверждены, данные нужно передать повторно и т. д.). */ void hello_world_appcall(void) { /* * Структура uip_conn содержит поле, называемое "appstate", которое * хранит состояние соединения приложения. Для упрощения доступа мы здесь * создали указатель. */ struct hello_world_state *s = &(uip_conn->appstate); /* * Если новое соединение только что было установлено, то мы должны * инициализировать protosocket в структуре состояния приложения. */ if(uip_connected()) { PSOCK_INIT(&s->p, s->inputbuffer, sizeof(s->inputbuffer)); } /* * На последнем шаге мы запускаем protosocket-функцию, которая в действительности * поддерживает обмен данными. Мы передали указатель на структуру состояния * приложения для текущего соединения. */ handle_connection(s); } /*---------------------------------------------------------------------------*/ /* * Это protosocket-функция, которая поддерживает соединение. Она всегда * должна возвратить int, но не должна этого делать явно, потому что * операторы возврата скрыты макросами PSOCK. */ static int handle_connection(struct hello_world_state *s) { PSOCK_BEGIN(&s->p); PSOCK_SEND_STR(&s->p, "Hello. What is your name?\n"); PSOCK_READTO(&s->p, '\n'); strncpy(s->name, s->inputbuffer, sizeof(s->name)); PSOCK_SEND_STR(&s->p, "Hello "); PSOCK_SEND_STR(&s->p, s->name); PSOCK_CLOSE(&s->p); PSOCK_END(&s->p); } /*---------------------------------------------------------------------------*/