Guide to Network Сетевое программирование от Биджа
Скачать 1.34 Mb.
|
103Beej's Guide to Network Programming Описание* Это базовые структуры для всех системных вызовов и функций, работающих с интернет адресами. Для заполнения этих структур вы часто будете использовать getaddinfo() и затем по мере надобности читать их. В памяти struct sockaddr_in и struct sockaddr_in6 начинаются с одинаковой struct sockaddr, ивы можете спокойно приводить один тип к другому без какого- либо ущерба за исключением возможного конца света. Пошутим над концом света… если вселенная прекратит своё существование в то время когда вы приводите struct sockaddr_in* к struct sockaddr*, обещаю, это будет чистейшее совпадение, ивам заботиться об этом ненужно. Так что, помня об этом, знайте, что если функция говорит, что принимает struct sockaddr* вы спокойно и безопасно можете привести к этому типу ваши struct sockaddr_in*, struct sockaddr_in6* или struct sockadd_storage*. Структура struct sockaddr_in используется с IPv4 адресами (вроде “192.0.2.10”). Она содержит семейство адресов (AF_INET), порт в sin_port и IPv4 адрес в sin_addr. Кроме того весть поле sin_zero , которое по утверждению некоторых людей должно содержать нули. Другие ничего об этом не утверждают документация Linux вообще об этом ничего не упоминает) и установка его в ноль не кажется действительно необходимой. Так что, если вы согласны, обнулите её функцией memset(). Да и struct in_addr это таинственный зверь на разных системах. Иногда это сумасшедший union со всеми видами #define-ов и прочей чушью. Но вам нужно использовать только поле s_addr, поскольку многие системы реализуют только его. struct sockadd_in6 очень похожа на struct in6_addr , но используется для IPv6. struct sockaddr_storage передаётся вили когда вы пытаетесь написать код, независящий от версии IP, ивы не знаете каким будет новый адрес - IPv4 или IPv6. Структура struct sockaddr_storage достаточно велика, чтобы содержать оба типа, в отличие от оригинальной маленькой struct sockaddr. Пример IPv4: struct sockaddr_in ip4addr; int s; ! ip4addr.sin_family = AF_INET; ip4addr.sin_port = htons(3490); inet_pton(AF_INET, "10.0.0.1", &ip4addr.sin_addr); s = socket(PF_INET, SOCK_STREAM, 0); bind(s, (struct sockaddr*)&ip4addr, sizeof ip4addr); ! // IPv6: struct sockaddr_in6 ip6addr; int s; ! ip6addr.sin6_family = AF_INET6; ip6addr.sin6_port = htons(4950); inet_pton(AF_INET6, "2001:db8:8714:3a90::12", &ip6addr.sin6_addr); s = socket(PF_INET6, SOCK_STREAM, 0); bind(s, (struct sockaddr*)&ip6addr, sizeof ip6addr); Смотри также, bind(), connect(), inet_aton(), inet_ntoa()! 104 Beej's Guide to Network Programming 10. Дополнительные ссылки Вы добрались так далеко и теперь возопили о большем Где ещё можно узнать обо всём этом великолепии Книги Для старой школы актуальны осязаемые дешёвые бумажные книги. Вот некоторые из превосходных книг. Обычно я связан сочень популярными интернет книготорговцами, но их нынешняя система обслуживания потребителей несовместима с печатными документами. Так что, откатов у меня больше нет. И если вы сочувствуете моим устремлениям, пожертвуйте, пожалуйста, paypal на beej@beej.us. :-) Unix Network Programming, volumes 1-2 by W. Richard Stevens. Published by Prentice Hall. ISBNs for volumes 1-2: 0131411551 , 0130810819 . 44 45 Internetworking with TCP/IP, volumes I-III by Douglas E. Comer and David L. Stevens. Published by Prentice Hall. ISBNs for volumes I, II, and III: 0131876716 , 0130319961 , 46 47 0130320714 . 48 TCP/IP Illustrated, volumes 1-3 by W. Richard Stevens and Gary R. Wright. Published by Addison Wesley. ISBNs for volumes 1, 2, and 3 (and a 3-volume set): 0201633469 , 49 020163354X , 0201634953 , (0201776316 ). 50 51 52 TCP/IP Network Administration by Craig Hunt. Published by O'Reilly & Associates, Inc. ISBN 0596002971 . 53 Advanced Programming in the UNIX Environment by W. Richard Stevens. Published by Addison Wesley. ISBN 0201433079 . 54 10.2.Web ссылки В Сети BSD Sockets: A Quick And Dirty Программирование Unix систем тоже) 55 The Unix Socket FAQ 56 Intro to TCP/IP 57 TCP/IP FAQ 58 The Winsock FAQ 59 105 http://beej.us/guide/url/unixnet1 44 http://beej.us/guide/url/unixnet2 45 http://beej.us/guide/url/intertcp1 46 http://beej.us/guide/url/intertcp2 47 http://beej.us/guide/url/intertcp3 48 http://beej.us/guide/url/tcpi1 49 http://beej.us/guide/url/tcpi2 50 http://beej.us/guide/url/tcpi3 51 http://beej.us/guide/url/tcpi123 52 http://beej.us/guide/url/tcpna 53 http://beej.us/guide/url/advunix 54 http://www.frostbytes.com/jimf/papers/sockets/sockets.html 55 http://www.developerweb.net/forum/forumdisplay.php?f=70 56 http://pclt.cis.yale.edu/pclt/COMM/TCPIP.HTM 57 http://www.faqs.org/faqs/internet/tcp-‐ip/tcp-‐ip-‐faq/part1/ 58 http://tangentsoft.net/wskfaq/ 59 Beej's Guide to Network И есть несколько серьёзных страниц в Википедии: Berkeley Sockets 60 Internet Protocol (IP) 61 Transmission Control Protocol (TCP) 62 User Datagram упаковка и распаковка данных) Все RFC - это настоящий отвал пустой породы Эти документы описывают назначенные номера, программные API и протоколы, используемые в Интернете. Я включил немного ссылок на них для вашего удовольствия. Так что хватайте бадью попкорна и надевайте вашу думательную шапку RFC 1 - Первый RFC; он даёт понимание того, каким Интернет был, когда он родился и взгляд на то, как он возрос. (Понятно, что этот RFC полностью устарел) RFC 768 - The User Datagram Protocol (UDP) 68 RFC 791 - The Internet Protocol (IP) 69 RFC 793 - The Transmission Control Protocol (TCP) 70 RFC 854 - The Telnet Protocol 71 RFC 959 - File Transfer Protocol (FTP) 72 RFC 1350 - The Trivial File Transfer Protocol (TFTP) 73 RFC 1459 - Internet Relay Chat Protocol (IRC) 74 RFC 1918 - Address Allocation for Private Internets 75 RFC 2131 - Dynamic Host Configuration Protocol (DHCP) 76 RFC 2616 - Hypertext Transfer Protocol (HTTP) 77 106 http://en.wikipedia.org/wiki/Berkeley_sockets 60 http://en.wikipedia.org/wiki/Internet_Protocol 61 http://en.wikipedia.org/wiki/Transmission_Control_Protocol 62 http://en.wikipedia.org/wiki/User_Datagram_Protocol 63 http://en.wikipedia.org/wiki/Client-‐server 64 http://en.wikipedia.org/wiki/Serialization 65 http://www.rfc-‐editor.org/ 66 http://tools.ietf.org/html/rfc1 67 http://tools.ietf.org/html/rfc768 68 http://tools.ietf.org/html/rfc791 69 http://tools.ietf.org/html/rfc793 70 http://tools.ietf.org/html/rfc854 71 http://tools.ietf.org/html/rfc959 72 http://tools.ietf.org/html/rfc1350 73 http://tools.ietf.org/html/rfc1459 74 http://tools.ietf.org/html/rfc1918 75 http://tools.ietf.org/html/rfc2131 76 http://tools.ietf.org/html/rfc2616 77 Beej's Guide to Network Programming RFC 2821 - Simple Mail Transfer Protocol (SMTP) 78 RFC 3330 - Special-Use IPv4 Addresses 79 RFC 3493 - Basic Socket Interface Extensions for IPv6 80 RFC 3542 - Advanced Sockets Application Program Interface (API) for IPv6 81 RFC 3849 - IPv6 Address Prefix Reserved for Documentation 82 RFC 3920 - Extensible Messaging and Presence Protocol (XMPP) 83 RFC 3977 —Network News Transfer Protocol (NNTP) 84 RFC 4193 —Unique Local IPv6 Unicast Addresses 85 RFC 4506 —External Data Representation Standard (XDR) Весть прекрасный онлайн инструмент для поиска и просмотра RFC . 87 107 http://tools.ietf.org/html/rfc2821 78 http://tools.ietf.org/html/rfc3330 79 http://tools.ietf.org/html/rfc3493 80 http://tools.ietf.org/html/rfc3542 81 http://tools.ietf.org/html/rfc3849 82 http://tools.ietf.org/html/rfc3920 83 http://tools.ietf.org/html/rfc3977 84 http://tools.ietf.org/html/rfc4193 85 http://tools.ietf.org/html/rfc4506 86 http://tools.ietf.org/rfc/ 87 Beej's Guide to Network Предметный указатель accept() 25, 66 MSG_WAITALL 93 ntohl() 84 bind() 22, 68 ntohs() 84 close() 28, 72 perror() 90 closesocket() 2 PF_INET 17 CreateProcess() 3 poll() 91 CreateThread() 3 read() 5 F_SETFL 83 recv() 26, 93 fcntl() 83 recvfrom() 27, 93 FD_CLR() 39 FD_ISSET() 39 SA_RESTART 60 FD_SET() 39 select() 38, 95 FD_ZERO() 39 send() 26 fork() 3 sendall() 44 sendto() 27 getaddrinfo() 18, 73 setsockopt() 97 gethostbyaddr() 77 shutdown() 28, 101 gethostbyname() 77 sigaction() 32 gethostname() 29, 76 SIGIO 83 getnameinfo() 80 SIGPIPE 72 getpeername() 28, 81 SIGURG 93 getprotobyname() 102 SO_BINDTODEVICE 97 getsockopt() 97 SO_BROADCAST 97 SO_RCVTIMEO 64 herror() 78 SO_REUSEADDR 97 hstrerror() 78 SO_SNDTIMEO 64 htonl() 84 SOCK_DGRAM 5 htons() 84 SOCK_RAW 59 SOCK_STREAM 5 INADDR_ANY 17 socket() 21, 102 INADDR_BROADCAST 17 SOL_SOCKET 97 inet_addr() 15 strerror() 90 inet_aton() 15 struct addrinfo 13 inet_ntoa() 16 struct hostent 77 inet_ntop() 87 struct in_addr 103 inet_pton() 87 struct pollfd 91 struct sockaddr 1 03 listen() 24, 89 struct sockaddr_in 1 03 struct timeval 39 MSG_DONTROUTE 99 MSG_DONTWAIT 99 write() 5 MSG_NOSIGNAL 99 WSACleanup() 2 MSG_OOB 99 WSAStartup() 2 MSG_PEEK 93 108 |