Meshnode3. Rapid Prototyping
• Ist einfach mit Python
• Twisted als Networking Engine
• Lauffähiger Prototyp am 17. März
Montag, 1. Juli 2013
7. Design Ziele
• Das Rad nicht neu erfinden
• Möglichst viele sinnvolle Threads
• Kein Eventloop
• Socket Buffer ausnutzen
Montag, 1. Juli 2013
8. Linked Lists
• BSD Libc hat Linked List Makros
• Lassen sich für beliebige Structs verwenden
Montag, 1. Juli 2013
9. /* Singly-linked List head. */
SLIST_HEAD(slisthead, entry) head =
SLIST_HEAD_INITIALIZER(head);
struct slisthead *headp;
/* Singly-linked List. */
struct entry {
...
SLIST_ENTRY(entry) entries;
...
} *n1, *n2, *n3, *np;
SLIST_INIT(&head); /* Initialize the list. */
n1 = malloc(sizeof(struct entry)); /* Insert at the head. */
SLIST_INSERT_HEAD(&head, n1, entries);
n2 = malloc(sizeof(struct entry)); /* Insert after. */
SLIST_INSERT_AFTER(n1, n2, entries);
SLIST_REMOVE(&head, n2, entry, entries);/* Deletion. */
free(n2);
n3 = SLIST_FIRST(&head);
Montag, 1. Juli 2013
10. /* Deletion from the head. */
SLIST_REMOVE_HEAD(&head, entries);
free(n3);
/* Forward traversal. */
SLIST_FOREACH(np, &head, entries)
np-> ...
/* Safe forward traversal. */
SLIST_FOREACH_SAFE(np, &head, entries, np_temp) {
np->do_stuff();
...
SLIST_REMOVE(&head, np, entry, entries);
free(np);
}
/* List Deletion. */
while (!SLIST_EMPTY(&head)) {
n1 = SLIST_FIRST(&head);
SLIST_REMOVE_HEAD(&head, entries);
free(n1);
}
Montag, 1. Juli 2013
12. Threads
• ProVerbindung ein Thread
• ein Thread um den eingangs Port zu
überwachen
• ein Thread um Packet History zu leeren
Montag, 1. Juli 2013
14. Peer Tasks
• Jeder Task macht fread auf seinem Socket
• Falls er genügend Daten für ein Paket erhält
lockt er sich die benötigten resourcen und
verwendet es weiter
• Kein anderer Task wird benötigt um ein
Paket weiterzusenden
Montag, 1. Juli 2013
15. Python vs C
• Versenden von 1000 Paketen
• 2 Nodes
Montag, 1. Juli 2013