uIP 1.0
Структуры данных | Файлы | Макросы
Библиотека protosocket-ов.

Библиотека protosocket-ов предоставляет интерфейс к стеку uIP, который работает похоже на традиционный интерфейс сокетов BSD. Подробнее...

Структуры данных

struct  psock
 Представление протосокета. Подробнее...

Файлы

файл  psock.h
 

Заголовочный файл библиотеки протосокетов


Макросы

#define PSOCK_INIT(psock, buffer, buffersize)
 Инициализирует протосокет.
#define PSOCK_BEGIN(psock)
 Запускает в фукнции протопоток протосокета.
#define PSOCK_SEND(psock, data, datalen)
 Отправление данных.
#define PSOCK_SEND_STR(psock, str)
 Отправляет строку, завершающуюся нулем (null-terminated string).
#define PSOCK_GENERATOR_SEND(psock, generator, arg)
 Генерация данных с помощью функции и отправка их
#define PSOCK_CLOSE(psock)
 Закрытие протосокета.
#define PSOCK_READBUF(psock)
 Чтение данных, пока буфер не заполнится.
#define PSOCK_READTO(psock, c)
 Читает данные, пока не попадется указанный символ.
#define PSOCK_DATALEN(psock)
 Длина данных, котррые были прочитаны ранее.
#define PSOCK_EXIT(psock)
 Выход из протопотока протосокета.
#define PSOCK_CLOSE_EXIT(psock)
 Закрывает протосокет и делает выход из протопотока протосокета.
#define PSOCK_END(psock)
 Декларирует конец протопотока протосокета.
#define PSOCK_NEWDATA(psock)
 Проверяет - поступили ли новые данные на протосокет.
#define PSOCK_WAIT_UNTIL(psock, condition)
 Ожидание, пока условие не станет true.

Подробное описание

Библиотека protosocket-ов предоставляет интерфейс к стеку uIP, который работает похоже на традиционный интерфейс сокетов BSD.

В отличие от программ, написанных для обычного интерфейса uIP, управляемого событиями, программы на protosocket-библиотеке выполнются последовательно и требуют явно реализованных машин состояний.

Protosocket-ы работают только с соединениями TCP.

Protosocket-библиотека использует Библиотека протопотоков (Protothreads) protothread-ы для предоставления последовательного потока выполнения. Это делате protosocket-ы нересурсоемкими в плане расхода памяти, однако подразумевается, что protosocket-ы наследуют фуциональные ограничения protothread-ов. Каждый protosocket живет только в пределах одной функции. Автоматические переменные (хранящиеся в стеке) не сохраняются между вызовами функций protosocket-библиотеки.

Заметки:
Поскольку protosocket-библиотека использует protothread-ы, локальные переменные не всегда будут сохранены между вызовами функции protosocket-библиотеки. Так что рекомендуется использовать локальные переменные с большой осторожностью.

Protosocket-библиотека предоставляет функции для отправки данных без разборки с повторными передачами и подтверждениями, как и с функциями для чтения данных с разборкой разбиения данных больше чем через 1 сегмент TCP.

Поскольку каждый протосокет запускается как protothread, то protosocket стартует с вызова PSOCK_BEGIN() в начале функции, в которой используется protosocket. Аналогично, protosocket protothread может быть прерван вызовом PSOCK_EXIT().


Макросы

#define PSOCK_BEGIN (   psock)

Запускает в фукнции протопоток протосокета.

Этот макрос запускает протопоток, ассоциированный с протосокетом, и он должен быть использован перед тем, как будет вызвана другая фукнция протосокета.

Аргументы:
psock(struct psock *) Указатель на протосокет, который будет запущен.
Примеры:
hello-world.c и smtp.c.

См. определение в файле psock.h строка 157

#define PSOCK_CLOSE (   psock)

Закрытие протосокета.

Этот макрос закрывает протосокет, и может быть вызван только из протопотока, в котором живет протосокет.

Аргументы:
psock(struct psock *) Указатель на протосокет, который будет закрыт.
Примеры:
hello-world.c и smtp.c.

См. определение в файле psock.h строка 236

#define PSOCK_CLOSE_EXIT (   psock)

Закрывает протосокет и делает выход из протопотока протосокета.

Этот макрос закрывает протосокет и делает выход из протопотока протосокета.

Аргументы:
psock(struct psock *) Указатель на протосокет.

См. определение в файле psock.h строка 312

#define PSOCK_DATALEN (   psock)

Длина данных, котррые были прочитаны ранее.

Этот макрос возвращает длину данных, которые были прочитаны ранее с использованием PSOCK_READTO() или PSOCK_READ().

Аргументы:
psock(struct psock *) Указатель на протосокет, содержащий данные.

См. определение в файле psock.h строка 284

#define PSOCK_END (   psock)

Декларирует конец протопотока протосокета.

Этот макрос используется, чтобы декларировать, где находится конец протопотока протосокета. Макрос должен всегда использоваться совместно с соответствующим макросом PSOCK_BEGIN().

Аргументы:
psock(struct psock *) Указатель на протосокет.
Примеры:
hello-world.c и smtp.c.

См. определение в файле psock.h строка 329

#define PSOCK_EXIT (   psock)

Выход из протопотока протосокета.

Этот макрос прерывает протопоток протосокета и должен почти всегда использоваться в сочетании с PSOCK_CLOSE().

См. также:
PSOCK_CLOSE_EXIT()
Аргументы:
psock(struct psock *) Указатель на протосокет.
Примеры:
smtp.c.

См. определение в файле psock.h строка 300

#define PSOCK_GENERATOR_SEND (   psock,
  generator,
  arg 
)

Генерация данных с помощью функции и отправка их

Аргументы:
psockУказатель на протосокет.
generatorУказатель на функцию генератора.
argАргумент для функции генератора.

Эта функция генерирует данные и посылает их через протосокет. Это может использоваться для динамической генерации данных для передачи, вместо того, чтобы генерировать данные в буфере заранее. Эта функция снижает необходимость в буферной памяти. Функция генератора реализована приложением, и указатель на функцию предоставляется в аргументе, когда делается вызов PSOCK_GENERATOR_SEND().

Функция генератора должна поместить сгенерированные данные напрямую в буфер uip_appdata, и возвратить длину сгенерированных данных. Функция генератора вызывается слоем протосокета, когда данные посылаются первый раз, и каждый раз, когда требуется ретрансмиссия.

См. определение в файле psock.h строка 220

#define PSOCK_INIT (   psock,
  buffer,
  buffersize 
)

Инициализирует протосокет.

Этот макрос инициализирует протосокет, и должен быть вызван перед протосокета. Инициализация таке указывает входной буфер для протосокета.

Аргументы:
psock(struct psock *) Указатель на протосокет, который будет инициализирован.
buffer(char *) Указатель на входной буфер для протосокета.
buffersize(unsigned int) Размер входного буфера.
Примеры:
hello-world.c и smtp.c.

См. определение в файле psock.h строка 142

#define PSOCK_NEWDATA (   psock)

Проверяет - поступили ли новые данные на протосокет.

Этот макрос используется совместно с макросом PSOCK_WAIT_UNTIL() для проверки - поступили ли данные на протосокет.

Аргументы:
psock(struct psock *) Указатель на протосокет.

См. определение в файле psock.h строка 343

#define PSOCK_READBUF (   psock)

Чтение данных, пока буфер не заполнится.

Этот марос будет блокироватьс выполнение протопотока на ожидании данных, и читать данные во входной буфер, указанный вызовом PSOCK_INIT(). Дата читаются, пока буфер не заполнится.

Аргументы:
psock(struct psock *) Указатель на протосокет, из которого читаются данные.

См. определение в файле psock.h строка 251

#define PSOCK_READTO (   psock,
 
)

Читает данные, пока не попадется указанный символ.

Этот макрос заблокирует выполнение на ожидании нужного символа, и читаемые данные будут попадать во входной буфер, указанный вызовом PSOCK_INIT(). Данные будут читаться в буфер, пока во входом потоке данных не появится указанный символ.

Аргументы:
psock(struct psock *) Указатель на protosocket с которого должны читаться данные.
c(char) Символ, на котором должно быть остановлено чтение.
Примеры:
hello-world.c и smtp.c.

См. определение в файле psock.h строка 270

#define PSOCK_SEND (   psock,
  data,
  datalen 
)

Отправление данных.

Этот макрос посылает данные через протосокет. Протопоток протосокета блокируется, пока все данные не будут отправлены, и не станет известно, что данные приняты на дальнем конце соединения TCP.

Аргументы:
psock(struct psock *) A pointer to the protosocket over which data is to be sent.
data(char *) Указатель на протосокет, через который будут отправлены данные.
datalen(unsigned int) Длина отправляемых данных.
Примеры:
smtp.c.

См. определение в файле psock.h строка 177

#define PSOCK_SEND_STR (   psock,
  str 
)

Отправляет строку, завершающуюся нулем (null-terminated string).

Аргументы:
psockУказатель на протосокет.
strСтрока для отправки.

Эта функция посылвает null-terminated строку через протосокет.

Примеры:
hello-world.c и smtp.c.

См. определение в файле psock.h строка 191

#define PSOCK_WAIT_UNTIL (   psock,
  condition 
)

Ожидание, пока условие не станет true.

Этот макрос блокирует протопоток, пока указанное условие не станет true. Макрос PSOCK_NEWDATA() может использоваться для проверки, поступили ли новые данные, когда протосокет находится в ожидании.

Обычно этот макрос используется так:

 PT_THREAD(thread(struct psock *s, struct timer *t))
 {
   PSOCK_BEGIN(s);

   PSOCK_WAIT_UNTIL(s, PSOCK_NEWADATA(s) || timer_expired(t));
   
   if(PSOCK_NEWDATA(s)) {
     PSOCK_READTO(s, '\n');
   } else {
     handle_timed_out(s);
   }
   
   PSOCK_END(s);
 }
Аргументы:
psock(struct psock *) Указатель на протосокет.
conditionУсловие, которое ждет блокировка.

См. определение в файле psock.h строка 376