Тип проверяется в соответствии с array-element-type
массива:
(defparameter w (create-jvector :element-type 'fixnum))
(array-element-type (jvector-vector v))
=> T
(array-element-type (jvector-vector w))
=> FIXNUM
Нажатие символа на W
приводит к ошибке. Как сказал jkiiski, тип используется главным образом, чтобы помочь компилятору иметь возможность использовать специализированные представления для массивов (битвекторы, строки, ...).
integer
может быть bignum, поэтому тип обновленного элемента: T
:
(upgraded-array-element-type 'integer)
=> T
Это решение подсказано jkiiski, а именно добавить тип в структуру; здесь я также переопределяю конструктор непосредственно из структуры:
(defstruct (j2vector
(:constructor make-jvector
(element-type
&aux
(start 0)
(vector (make-array 0
:adjustable t
:fill-pointer 0
:element-type element-type)))))
element-type
vector
(start 0 :type (integer 0)))
Затем вы явно проверяете тип:
(defun push-jvector (elt jvec)
(assert (typep elt (j2vector-element-type jvec)) ())
(vector-push-extend elt (j2vector-vector jvec)))
Я не видел один, но Вы найдете больше информации, чем Вы требуете здесь:
http://www.enchantedage.com/node/8
Не ужасно трудно реализовать, просто немного работы.
Существует код на странице, которая демонстрирует это, которое основывается на Unix и окнах, включая обоих часть сервера (introducer) и клиентские части. Это не перечисляет лицензию, но автор указывает в readme, что техника является бесплатной, и перереализация его от информации на странице, и пример исходного кода, кажется, относительно легок.
Автор, кажется, владелец веб-сайта enchantedage, таким образом, можно, вероятно, связаться с ними непосредственно для получения дополнительной информации.
У меня нет ответа здесь, я боюсь, но я действительно знаю, что несколько лет назад было некоторое исследование, проведенное в области, которая закончила тем, что породила некоторые документы IETF. Любопытный читатель мог бы уже быть знаком с ними:
Лучшее, что я видел, это UDT , это надежная библиотека UDP, которая также включает режим соединения «рандеву», который помогает позаботиться о перфорации NAT. Все, что вам нужно сделать, это выяснить внешний IP-адрес и порт и каким-то образом передать его другому клиенту (и наоборот). Узнав эту информацию, вы одновременно подключаетесь и выполняете привязку (с установленным режимом рандеву), и он сделает все возможное, чтобы выяснить остальное.