uIP 1.0
C:/asm/STM32-ethernet/ENC28J60prj/uip-master/apps/hello-world/hello-world.c
См. документацию.
00001 /**
00002  * \addtogroup helloworld
00003  * @{
00004  */
00005 
00006 /**
00007  * \file
00008  *         Пример, как писать приложения uIP, используя
00009  *         протосокеты.
00010  * \author
00011  *         Adam Dunkels <adam@sics.se>
00012  */
00013 
00014 /*
00015  * Это короткий пример, как писать приложения uIP, используя
00016  * протосокеты.
00017  */
00018 
00019 /*
00020  * Мы задаем состояние приложения (struct hello_world_state) в файле
00021  * hello-world.h, поэтому здесь его нужно подключить. Мы также подключаем
00022  * uip.h (так как он не может быть подключен в hello-world.h) и
00023  * <string.h>, так как нам нужна функция memcpy().
00024  */
00025 #include "hello-world.h"
00026 #include "uip.h"
00027 #include <string.h>
00028 
00029 /*
00030  * Декларация protosocket-функции которая обрабатывает соединение
00031  * (её код определен в конце модуля).
00032  */
00033 static int handle_connection(struct hello_world_state *s);
00034 /*---------------------------------------------------------------------------*/
00035 /*
00036  * Функция инициализации. Мы должны явно вызвать эту функцию их кода
00037  * инициализации системы, немного после вызова uip_init().
00038  */
00039 void hello_world_init(void)
00040 {
00041   /* Мы запускаем прослушивание соединений на порту 1000 TCP. */
00042   uip_listen(HTONS(1000));
00043 }
00044 /*---------------------------------------------------------------------------*/
00045 /*
00046  * В файле hello-world.h есть определение макроса UIP_APPCALL для
00047  * hello_world_appcall, так что эта функция является функцией приложения uIP.
00048  * Эта функция будет вызвана при любом событии uIP (например, установлено
00049  * новое соединение, пришли новые данные, отправленные данные были 
00050  * подтверждены, данные нужно передать повторно и т. д.).
00051  */
00052 void hello_world_appcall(void)
00053 {
00054   /*
00055    * Структура uip_conn содержит поле, называемое "appstate", которое
00056    * хранит состояние соединения приложения. Для упрощения доступа мы здесь
00057    * создали указатель.
00058    */
00059    struct hello_world_state *s = &(uip_conn->appstate);
00060 
00061   /*
00062    * Если новое соединение только что было установлено, то мы должны
00063    * инициализировать protosocket в структуре состояния приложения.
00064    */
00065    if(uip_connected())
00066    {
00067       PSOCK_INIT(&s->p, s->inputbuffer, sizeof(s->inputbuffer));
00068    }
00069 
00070   /*
00071    * На последнем шаге мы запускаем protosocket-функцию, которая в действительности
00072    * поддерживает обмен данными. Мы передали указатель на структуру состояния
00073    * приложения для текущего соединения.
00074    */
00075    handle_connection(s);
00076 }
00077 
00078 /*---------------------------------------------------------------------------*/
00079 /*
00080  * Это protosocket-функция, которая поддерживает соединение. Она всегда
00081  * должна возвратить int, но не должна этого делать явно, потому что
00082  * операторы возврата скрыты макросами PSOCK.
00083  */
00084 static int handle_connection(struct hello_world_state *s)
00085 {
00086   PSOCK_BEGIN(&s->p);
00087   PSOCK_SEND_STR(&s->p, "Hello. What is your name?\n");
00088   PSOCK_READTO(&s->p, '\n');
00089   strncpy(s->name, s->inputbuffer, sizeof(s->name));
00090   PSOCK_SEND_STR(&s->p, "Hello ");
00091   PSOCK_SEND_STR(&s->p, s->name);
00092   PSOCK_CLOSE(&s->p);
00093   PSOCK_END(&s->p);
00094 }
00095 /*---------------------------------------------------------------------------*/