uIP 1.0
|
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 /*---------------------------------------------------------------------------*/