uIP 1.0
hello-world.c
/**
 * \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);
}
/*---------------------------------------------------------------------------*/