c_network
Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Následující verze | Předchozí verze | ||
| c_network [2012/02/18 20:24] – vytvořeno djbuldog | c_network [2025/08/28 10:09] (aktuální) – upraveno mimo DokuWiki 127.0.0.1 | ||
|---|---|---|---|
| Řádek 1: | Řádek 1: | ||
| - | ==== Broadcast ==== | + | ====== Programovani soketu v C ====== |
| + | |||
| + | ===== Sokety ===== | ||
| + | |||
| + | * zakladni navod prace se sokety: | ||
| + | * http:// | ||
| + | * navod na libovolny raw paket: | ||
| + | * http:// | ||
| + | * http:// | ||
| + | * super navod na broadcast: | ||
| + | * http:// | ||
| + | * blokovane cteni - timeout: | ||
| + | * http:// | ||
| + | * co jsou blokovane a neblokovane sockety .. neblokovany muze byt i bez select | ||
| + | * http:// | ||
| + | * co je vlastne select()? | ||
| + | * http:// | ||
| + | |||
| + | ==== Datové typy a struktury pro HW nebo protokoly ==== | ||
| + | * int může být někde 32 bit, někde třeba 16 bit, pokud potřebujeme určitou přesnou velikost, jsou užitečné typy | ||
| + | * int8_t, uint8_t, int16_t, uint16_t ... int64_t, uint64_t | ||
| + | * viz http:// | ||
| + | * pokud používáme datové struktury | ||
| + | * vkládají se někdy mezi jednotlivé atributy prazdné místa do paměti, | ||
| + | * popřípadě se provádí nějaké optimalizace, | ||
| + | * někdy potřebujeme, | ||
| + | * použijeme | ||
| + | < | ||
| + | struct my_struct { | ||
| + | uint8_t | ||
| + | uint16_t field2; | ||
| + | } __attribute__((packed)); | ||
| + | </ | ||
| + | * výhody a nvýhody viz http:// | ||
| + | * některé architektury používají jiný formát ukládání čísel (big-endian, | ||
| + | * pro zachování stejného způsobu ukládání se používá funkce htons (HostTONetworkSmall), | ||
| + | < | ||
| + | #include < | ||
| + | |||
| + | uint32_t htonl(uint32_t hostlong); | ||
| + | uint16_t htons(uint16_t hostshort); | ||
| + | uint32_t ntohl(uint32_t netlong); | ||
| + | uint16_t ntohs(uint16_t netshort); | ||
| + | </ | ||
| + | |||
| + | ==== Prace s adresami ==== | ||
| + | |||
| + | * struct sockaddr je nejvice obecna | ||
| + | * jednotlive struktury jsou mezi sebou prevoditelne, | ||
| + | |||
| + | < | ||
| + | include < | ||
| + | |||
| + | // All pointers to socket address structures are often cast to pointers | ||
| + | // to this type before use in various functions and system calls: | ||
| + | |||
| + | struct sockaddr { | ||
| + | unsigned short sa_family; | ||
| + | char sa_data[14]; | ||
| + | }; | ||
| + | |||
| + | |||
| + | // IPv4 AF_INET sockets: | ||
| + | |||
| + | struct sockaddr_in { | ||
| + | short sin_family; | ||
| + | unsigned short | ||
| + | struct in_addr | ||
| + | char | ||
| + | }; | ||
| + | |||
| + | struct in_addr { | ||
| + | unsigned long s_addr; | ||
| + | }; | ||
| + | |||
| + | |||
| + | // IPv6 AF_INET6 sockets: | ||
| + | |||
| + | struct sockaddr_in6 { | ||
| + | u_int16_t | ||
| + | u_int16_t | ||
| + | u_int32_t | ||
| + | struct in6_addr sin6_addr; | ||
| + | u_int32_t | ||
| + | }; | ||
| + | |||
| + | struct in6_addr { | ||
| + | unsigned char | ||
| + | }; | ||
| + | |||
| + | |||
| + | // General socket address holding structure, big enough to hold either | ||
| + | // struct sockaddr_in or struct sockaddr_in6 data: | ||
| + | |||
| + | struct sockaddr_storage { | ||
| + | sa_family_t | ||
| + | |||
| + | // all this is padding, implementation specific, ignore it: | ||
| + | char __ss_pad1[_SS_PAD1SIZE]; | ||
| + | int64_t | ||
| + | char __ss_pad2[_SS_PAD2SIZE]; | ||
| + | }; | ||
| + | </ | ||
| + | |||
| + | ===== Broadcast | ||
| * pokrývá dvě vrstvy modelu ISO/OSI (spojová a síťová) | * pokrývá dvě vrstvy modelu ISO/OSI (spojová a síťová) | ||
| * MAC broadcast (FF: | * MAC broadcast (FF: | ||
| Řádek 21: | Řádek 125: | ||
| - | === test příjmu broadcastu aplikací listen === | + | ==== Test příjmu broadcastu aplikací listen |
| * OTESTOVAT ZNOVU.. NC MA TEHDENCY UZAMCIT SE JEN NA JEDNU RCVIP.. MUSIM HO PO KAZDEM POKUSU ZABIT | * OTESTOVAT ZNOVU.. NC MA TEHDENCY UZAMCIT SE JEN NA JEDNU RCVIP.. MUSIM HO PO KAZDEM POKUSU ZABIT | ||
| * A TEN MZ VERZE 0.40 NEUMI ZMENIT MAC, MALFORMUJE PKT | * A TEN MZ VERZE 0.40 NEUMI ZMENIT MAC, MALFORMUJE PKT | ||
| Řádek 80: | Řádek 184: | ||
| * přijímá data pouze na intf odpovídající uvedené IP adrese | * přijímá data pouze na intf odpovídající uvedené IP adrese | ||
| * pro odesílání dat nebo broadcastu se použije uvedená IP | * pro odesílání dat nebo broadcastu se použije uvedená IP | ||
| - | |||
| - | == Sokety == | ||
| - | |||
| - | * zakladni navod prace se sokety: | ||
| - | * http:// | ||
| - | * navod na libovolny raw paket: | ||
| - | * http:// | ||
| - | * http:// | ||
| - | * super navod na broadcast: | ||
| - | * http:// | ||
| - | * blokovane cteni - timeout: | ||
| - | * http:// | ||
| - | * co jsou blokovane a neblokovane sockety .. neblokovany muze byt i bez select | ||
| - | * http:// | ||
| - | * co je vlastne select()? | ||
| - | * http:// | ||
| - | |||
| - | == datové typy a struktury pro HW nebo protokoly == | ||
| - | * int může být někde 32 bit, někde třeba 16 bit, pokud potřebujeme určitou přesnou velikost, jsou užitečné typy | ||
| - | * int8_t, uint8_t, int16_t, uint16_t ... int64_t, uint64_t | ||
| - | * viz http:// | ||
| - | * pokud používáme datové struktury | ||
| - | * vkládají se někdy mezi jednotlivé atributy prazdné místa do paměti, | ||
| - | * popřípadě se provádí nějaké optimalizace, | ||
| - | * někdy potřebujeme, | ||
| - | * použijeme | ||
| - | < | ||
| - | struct my_struct { | ||
| - | uint8_t | ||
| - | uint16_t field2; | ||
| - | } __attribute__((packed)); | ||
| - | </ | ||
| - | * výhody a nvýhody viz http:// | ||
| - | * některé architektury používají jiný formát ukládání čísel (big-endian, | ||
| - | * pro zachování stejného způsobu ukládání se používá funkce htons, htonl .. | ||
| - | < | ||
| - | #include < | ||
| - | |||
| - | uint32_t htonl(uint32_t hostlong); | ||
| - | uint16_t htons(uint16_t hostshort); | ||
| - | uint32_t ntohl(uint32_t netlong); | ||
| - | uint16_t ntohs(uint16_t netshort); | ||
| - | </ | ||
c_network.1329593084.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)
