uIP 1.0
|
Библиотека 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-библиотека предоставляет функции для отправки данных без разборки с повторными передачами и подтверждениями, как и с функциями для чтения данных с разборкой разбиения данных больше чем через 1 сегмент TCP.
Поскольку каждый протосокет запускается как protothread, то protosocket стартует с вызова PSOCK_BEGIN() в начале функции, в которой используется protosocket. Аналогично, protosocket protothread может быть прерван вызовом PSOCK_EXIT().
#define PSOCK_BEGIN | ( | psock | ) |
Запускает в фукнции протопоток протосокета.
Этот макрос запускает протопоток, ассоциированный с протосокетом, и он должен быть использован перед тем, как будет вызвана другая фукнция протосокета.
psock | (struct psock *) Указатель на протосокет, который будет запущен. |
#define PSOCK_CLOSE | ( | psock | ) |
Закрытие протосокета.
Этот макрос закрывает протосокет, и может быть вызван только из протопотока, в котором живет протосокет.
psock | (struct psock *) Указатель на протосокет, который будет закрыт. |
#define PSOCK_CLOSE_EXIT | ( | psock | ) |
#define PSOCK_DATALEN | ( | psock | ) |
Длина данных, котррые были прочитаны ранее.
Этот макрос возвращает длину данных, которые были прочитаны ранее с использованием PSOCK_READTO() или PSOCK_READ().
psock | (struct psock *) Указатель на протосокет, содержащий данные. |
#define PSOCK_END | ( | psock | ) |
Декларирует конец протопотока протосокета.
Этот макрос используется, чтобы декларировать, где находится конец протопотока протосокета. Макрос должен всегда использоваться совместно с соответствующим макросом PSOCK_BEGIN().
psock | (struct psock *) Указатель на протосокет. |
#define PSOCK_EXIT | ( | psock | ) |
Выход из протопотока протосокета.
Этот макрос прерывает протопоток протосокета и должен почти всегда использоваться в сочетании с PSOCK_CLOSE().
psock | (struct psock *) Указатель на протосокет. |
#define PSOCK_GENERATOR_SEND | ( | psock, | |
generator, | |||
arg | |||
) |
Генерация данных с помощью функции и отправка их
psock | Указатель на протосокет. |
generator | Указатель на функцию генератора. |
arg | Аргумент для функции генератора. |
Эта функция генерирует данные и посылает их через протосокет. Это может использоваться для динамической генерации данных для передачи, вместо того, чтобы генерировать данные в буфере заранее. Эта функция снижает необходимость в буферной памяти. Функция генератора реализована приложением, и указатель на функцию предоставляется в аргументе, когда делается вызов PSOCK_GENERATOR_SEND().
Функция генератора должна поместить сгенерированные данные напрямую в буфер uip_appdata, и возвратить длину сгенерированных данных. Функция генератора вызывается слоем протосокета, когда данные посылаются первый раз, и каждый раз, когда требуется ретрансмиссия.
#define PSOCK_INIT | ( | psock, | |
buffer, | |||
buffersize | |||
) |
Инициализирует протосокет.
Этот макрос инициализирует протосокет, и должен быть вызван перед протосокета. Инициализация таке указывает входной буфер для протосокета.
psock | (struct psock *) Указатель на протосокет, который будет инициализирован. |
buffer | (char *) Указатель на входной буфер для протосокета. |
buffersize | (unsigned int) Размер входного буфера. |
#define PSOCK_NEWDATA | ( | psock | ) |
Проверяет - поступили ли новые данные на протосокет.
Этот макрос используется совместно с макросом PSOCK_WAIT_UNTIL() для проверки - поступили ли данные на протосокет.
psock | (struct psock *) Указатель на протосокет. |
#define PSOCK_READBUF | ( | psock | ) |
Чтение данных, пока буфер не заполнится.
Этот марос будет блокироватьс выполнение протопотока на ожидании данных, и читать данные во входной буфер, указанный вызовом PSOCK_INIT(). Дата читаются, пока буфер не заполнится.
psock | (struct psock *) Указатель на протосокет, из которого читаются данные. |
#define PSOCK_READTO | ( | psock, | |
c | |||
) |
Читает данные, пока не попадется указанный символ.
Этот макрос заблокирует выполнение на ожидании нужного символа, и читаемые данные будут попадать во входной буфер, указанный вызовом PSOCK_INIT(). Данные будут читаться в буфер, пока во входом потоке данных не появится указанный символ.
psock | (struct psock *) Указатель на protosocket с которого должны читаться данные. |
c | (char) Символ, на котором должно быть остановлено чтение. |
#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) Длина отправляемых данных. |
#define PSOCK_SEND_STR | ( | psock, | |
str | |||
) |
Отправляет строку, завершающуюся нулем (null-terminated string).
psock | Указатель на протосокет. |
str | Строка для отправки. |
Эта функция посылвает null-terminated строку через протосокет.
#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 | Условие, которое ждет блокировка. |