Главная страница
Навигация по странице:

  • Beejs Guide to Network Programming ! Using Internet Sockets

  • 2. Что такое сокет 5 2.1. Два типа интернет сокетов 5 2.2. Низкоуровневый Вздор и Теория сетей 6 3. IP адреса, структуры и повреждение данных 9

  • 4. Прыжок изв. Системные вызовы или Облом 18

  • 6. Архитектура Клиент-­‐Сервер 30 6.1. Простой потоковый сервер 30 6.2. Простой потоковый клиент 33 6.3. Дейтаграммные сокеты 34 7. Немного продвинутая техника

  • 8. Общие вопросы 59 9. Man Страницы 65 9.1. accept()* 66* 9.2. bind()* 68 * 9.3. connect()* 70*

  • 9.15. listen()* 89* 9.16. perror(), strerror()* 90* 9.17. poll()* 91* 9.18. recv(), recvfrom()* 93* 9.19. select()*

  • 9.24. struct sockaddr сотоварищи. Дополнительные ссылки 105 Книги 105 10.2.Web ссылки 105 10.3.RFC 106 Предметный указатель 108

  • 1. Введение Люди Программирование сокетов вас убивает Слишком трудно выискать что-то в man

  • 1.2. Платформа и компилятор Код, приведенный в этом документе, проверенна с компилятором GNU Однако он должен строиться на любой платформе, использующей gcc

  • Settings

  • WSACleanup()

  • CSocket

  • CreateProcess()

  • 1.9. Копирайт и распространение Beejs Guide to Network Programming is Copyright © 2012 Brian “Beej Jorgensen” Hall. 3

  • Guide to Network Сетевое программирование от Биджа


    Скачать 1.34 Mb.
    НазваниеGuide to Network Сетевое программирование от Биджа
    Дата02.05.2019
    Размер1.34 Mb.
    Формат файлаpdf
    Имя файлаbgnet_A4_rus.pdf
    ТипGuide
    #75918
    страница1 из 13
      1   2   3   4   5   6   7   8   9   ...   13


    Beej's Guide to Network Сетевое программирование от Биджа Использование Интернет Сокетов
    Брайан “Beej Jorgensen” Холл Версия 3.0.15 Июль 3, 2012
    Copyright © 2012 Brian “Beej Jorgensen” Hall Перевод Андрей Косенко aikos55@gmail.com
    i

    Beej's Guide to Network Programming
    !
    Beej's Guide to Network Programming!
    Using Internet Sockets
    Brian “Beej Jorgensen” Hall
    beej@beej.us
    Version 3.0.15
    July 3, 2012
    Copyright © 2012 Brian “Beej Jorgensen” Hall
    ii

    Beej's Guide to Network Спасибо всем, кто помогал мне в написании этого документа в прошлом и будущем. Спасибо Ashley за уговоры превратить дизайн обложки в лучший образчик программистского художества, на которое я способен. Спасибо всем, кто делает Свободные программы и пакеты, которые я использовал при создании этого Руководства
    GNU, Linux, Slackware, vim, Python, Inkscape, Apache FOP, Firefox, Red Hat и многие другие. И наконец, большое спасибо буквально тысячам из вас, кто присылал свои предложения по улучшению руководства и слова ободрения. Я посвящаю это руководство моим величайшим героями вдохновителям в мире компьютеров Дональду Кнуту (Donald Knuth), Брюсу Шнайеру (Bruce Schneier), Ричарду
    Стивенсу (W. Richard Stevens), Стиву Возняку (The Woz), моим Читателями всему Free and Open Source Software Community. Англоязычный вариант этой книги написан автором на XML в редакторе vim нас инструментами GNU. Картина обложки и диаграммы сделаны на
    Inkscape. XML преобразован в HTML и XSL-FO пользовательскими скриптами Python. XSL-
    FO вывод затем был преобразован Apache FOP в PDF документы с использованием шрифтов Liberation. Все инструменты это 100% Free and Open Source Software. За исключением взаимно достигнутого участниками данной работы согласия, автор предлагает всё как есть и не делает никаких заявлений и не даёт никаких гарантий относительно данной работы, выражений, предположений, предписаний или чего-либо иного, включая, без ограничений, гарантии прав собственности, возможности сбыта, применимость для определённых целей, ненарушение законов, отсутствие скрытых или иных дефектов, точность, наличие или отсутствие обнаруживаемых или не обнаруживаемых ошибок. За исключением области действия применимого законодательства, автор не несёт ответственности низа какие события, происходящие в силу правовых предположений по любым особым, случайным, косвенным, штрафным или характерным сбоям, возникшим при использовании данной работы, особенно если автор предупреждало возможности возникновения таких сбоев. Этот документ может свободно распространяться под лицензией Creative Commons
    Attribution-Noncommercial-No Derivative Works 3.0 License. Смотрите раздел Копирайт и распространение.
    !
    !
    !
    Copyright © 2012 Brian “Beej Jorgensen” Hall
    !
    iii
    Перевод книги подготовлен на системе Mac OS X с использованием стандартных инструментов

    Beej's Guide to Network Содержание. Введение
    1
    1.1. Для кого
    1 1.2. Платформа и компилятор
    1 1.3. Официальная страница и книги
    1 1.4. Для программистов Solaris/SunOS
    1 1.5. Для программистов Windows
    2 1.6. Политика Email
    3 1.7. Зеркалирование
    3 1.8. Замечания для переводчиков
    3 1.9. Копирайт и распространение
    3
    2. Что такое сокет?
    5
    2.1. Два типа интернет сокетов
    5 2.2. Низкоуровневый Вздор и Теория сетей
    6
    3. IP адреса, структуры и повреждение данных
    9
    3.1. IP адреса, версии 4 и 6 9
    3.2. Порядок байт
    11 3.3. Структуры
    12 3.4. IP адреса, Часть Вторая
    15
    4. Прыжок изв. Системные вызовы или Облом
    18
    5.1. getaddrinfo() - К старту - товсь!
    18 5.2. soket() - Получи дескриптор файла
    21 5.3. bind() - На каком я порте
    22 5.4. connect() - Эй, вы там
    23 5.5. listen() - Позвони мне, позвони 5.6. accept() - Спасибо за звонок на порт 3490.”
    25 5.7. send() and recv() - Поговори со мною, бэби!
    26 5.8. sendto() и recvfrom() - Поговори со мной, стиль
    27 5.9. close() и shutdown() - Прочь сглаз моих
    28 5.10.getpeername() - Кто вы
    28 5.11.gethostname() - Кто Я
    29
    6. Архитектура Клиент-­‐Сервер
    30
    6.1. Простой потоковый сервер
    30 6.2. Простой потоковый клиент
    33 6.3. Дейтаграммные сокеты
    34
    7. Немного продвинутая техника
    38
    7.1. Блокировка
    38 7.2. Мультиплексирование синхронного ввода/вывода
    38 7.3. Обработка незавершённых send()
    44 iv

    Beej's Guide to Network Programming
    7.4. Сериализация - Как упаковать данные
    45 7.5. Дитя Инкапсуляции Данных
    53 7.6. Широковещательные пакеты - Hello, world!
    55
    8. Общие вопросы
    59
    9. Man Страницы
    65
    9.1. accept()*
    66*
    9.2. bind()*
    68*
    9.3. connect()*
    70*
    9.4. close()*
    72*
    9.5. getaddrinfo(), freeaddrinfo(), gai_strerror()*
    73*
    9.6. gethostname()*
    76*
    9.7. gethostbyname(), gethostbyaddr()*
    77*
    9.8. getnameinfo()*
    80*
    9.9. getpeername()*
    81*
    9.10. errno*
    82*
    9.11. fcntl()*
    83*
    9.12. htons(), htonl(), ntohs(), ntohl()*
    84*
    9.13. inet_ntoa(), inet_aton(), inet_addr*
    86*
    9.14. inet_ntop(), inet_pton()*
    87*
    9.15. listen()*
    89*
    9.16. perror(), strerror()*
    90*
    9.17. poll()*
    91*
    9.18. recv(), recvfrom()*
    93*
    9.19. select()*
    95*
    9.20. setsockopt(), getsockopt()*
    97*
    9.21. send(), sendto()*
    99*
    9.22. shutdown()*
    101*
    9.23. socket()*
    102*
    9.24. struct sockaddr сотоварищи. Дополнительные ссылки
    105 Книги
    105 10.2.Web ссылки
    105 10.3.RFC
    106 Предметный указатель

    108
    v

    Beej's Guide to Network Programming
    1. Введение Люди Программирование сокетов вас убивает Слишком трудно выискать что-то в
    man страницах Вы хотите писать крутые Интернет программы, ноу вас нет времени продираться сквозь завалы struct-ур пытаясь определить нужно ли вам вызывать bind() перед connect() и т.д. и т.п.? Догадываетесь Я уже сделал эту грязную работу и умираю от желания поделиться со всеми Вы попали в нужное место. Этот документ должен дать С-программисту средней руки край, за который ему(ей) можно ухватиться в этом сетевом сумбуре. И поверьте, я полностью увлечен будущими настоящим тоже) и обновил это руководство для IPv6! Наслаждайтесь
    1.1. Для кого Этот документ был написан как учебное пособие, а не как полное описание. Может быть лучше всего его читать людям, только начинающим программировать с сокетами, чтобы обрести точку опоры. В любом случае это неполное и исчерпывающее описание программирования сокетов. Надеюсь, однако, что этого будет достаточно, чтобы начать чувствовать)
    1.2. Платформа и компилятор Код, приведенный в этом документе, проверенна с компилятором GNU Однако он должен строиться на любой платформе, использующей
    gcc
    . Естественно, он неприменим, если вы программируете для Windows. Смотрите раздел 1.5. Для программистов Windows.
    1.3. Официальная страница и книги Официальное расположение этого документа http://beej.us/guide/bgnet/. Здесь вы также найдёте примеры кода и переводы на разные языки. Чтобы купить прекрасно переплетённые печатные копии (их называют книгами) посетите http://beej.us/guide/url/bgbuy. Я буду признателен, поскольку это поможет поддержать мой книгописательский стиль жизни.
    1.4. Для программистов Solaris/SunOS Компилируя для Solaris или Sun OS вам нужно указать дополнительные ключи в командную строку для включения правильных библиотек. Для этого просто добавьте

    -lnsl -lsocket -lresolv

    вконец команды компилятора. Как здесь
    $ cc -o server server.c -lnsl -lsocket -lresolv Если всё равно получаете ошибки, можете попробовать добавить ещё “-lxnet” вконец этой строки. Я точно не знаю, что это делает, но некоторым людям кажется, что так надо.
    Ещё одно место, где могут обнаружиться проблемы, это вызов setsockopt(). Прототип отличается от моего на е, так что вместо int yes=1; введите char yes=’1’; Поскольку у меня нет Sun, я приведённую выше информацию не проверял. Это люди просто сказали мне по email.
    !
    !
    1

    Beej's Guide to Network Programming
    1.5. Для программистов Windows Вот здесь, исторически, я с удовольствием немного попеняю напросто потому что я её очень не люблю. Ноя должен быть честными сказать вам, что у Windows громадная база установок иона совершенно прелестная операционная система. Говорят разлука заставляет сердце любить сильнее и я верю, что это так. (А может это возраст. Но после десяти с гаком лет неиспользования Windows в моей работе я могу сказать. Я намного счастливее Так что я могу присесть и спокойно сказать Конечно, пользуйтесь Windows!” Ладно, стисну зубы искажу. Так что я до сих пор поддерживаю ваши попытки использовать вместо этого Linux ,
    2
    BSD или какую-нибудь Unix. Но люди любят то, что они любят, и Windows народ с удовольствием узнает, что в общем виде эта информация пригодна и для них, конечно с небольшими изменениями. Что вы можете круто сделать, это установить Cygwin , что есть набор Unix инструментов для Windows. За бокалом вина я слышал, что это позволяет всем нашим программам компилироваться незменёнными. Но некоторые из вас могут возжелать делать всё в Чисто Windows Стиле. Это очень отважный поступок ивам надо немедленно бежать и брать Unix. Нет, нет, я шучу Я хочу немного побыть дружественным(…нее) к Вот что вам нужно сделать (кроме установки Cygwin!): первое, игнорировать значительное множество упомянутых мною системных заголовочных файлов. Вам нужно включить только
    #include Подождите Вам также нужно вызвать WSAStartup() перед тем как использовать что- либо в библиотеке сокетов. Код может выглядеть примерно так
    #include
    {
    WSADATA wsaData;
    // если это не работает
    //WSAData wsaData;
    // попробуйте так
    // MAKEWORD(1,1) for Winsock 1.1, MAKEWORD(2,0) для Winsock 2.0: if (WSAStartup(MAKEWORD(1,1), &wsaData) != 0) { fprintf(stderr, "WSAStartup failed.\n”); exit(1);
    } Вам также нужно сказать компилятору компоновать с библиотекой Winsock, обычно называемой wsock32.lib, или winsock32.lib, или ws2_32.lib для Winsock 2.0. Под
    VC++ это можно сделать вменю под Settings…. Кликните пункт Link и ищите окошко “Object/library modules”. Добавьте в этот список

    wsock32.lib

    (или что вы там предпочитаете. Или я так слышал В конце, после всей работы с библиотекой сокетов вам нужно вызвать WSACleanup(). Подробности смотрите в online help. Когда вы это сделали, то остальные примеры в этом пособии в общем должны работать, за некоторыми исключениями. Первое, вместо close() нужно использовать
    closesocket(). Кроме того, select() работает только с дескриптором сокета, а нес дескриптором файла (типа 0 для stdin).
    2
    http://www.linux.com/
    2
    http://www.bsd.org/
    3
    http://www.cygwin.com/
    4

    Beej's Guide to Network Также вы можете использовать класс CSocket. За информацией обращайтесь в страницы помощи компилятора. Информацию почитайте в Winsock FAQ и выходите отсюда. Последнее, я слышал, что в Windows нет системного вызова fork(), который як сожалению, использовал в некоторых примерах. Может быть нужно подключить библиотеку POSIX или что-то ещё чтобы он работал, или вы можете использовать
    CreateProcess(). У вызова fork() нет аргументов, а CreateProcess() имеет около
    48 миллиардов аргументов. Если вы до этого недоросли, то CreateThread() немного легче переваривать, но, к сожалению дискуссия о многопоточности выходит за рамки этого документа. Вы же понимаете, я могу только разглагольствовать об этом
    1.6. Политика Email
    Вообще-то я могу помочь с вопросами по email, так что пишите, не стесняйтесь, ноя не могу гарантировать ответа. Я живу весьма насыщенной жизнью и бывают времена, когда я не могу отвечать на ваши вопросы. В этом случае я удаляю послания. Ничего личного, просто у меня не всегда есть время для детального ответа на ваш запрос. Как правило, чем сложней вопрос, тем маловероятней я отвечу. Если вы сумеете сузить вопрос и включить в него дополнительную информацию (как платформа, компилятор, полученные сообщения об ошибках и всё, что по вашему мнению может мне помочь, тотем вероятнее получите ответ. Подсказки прочтите в ESR документе How To Ask Questions
    The Smart Way . Если вы не получили ответа поковыряйтесь ещё немного, попробуйте найти решение и если оно до сих пор не найдено, напишите мне снова, приложив найденную информацию, и надеюсь, её будет достаточно чтобы я вам помог. И когда я уже извёл вас как писать и не писать мне, хотелось бы сказать, что я очень благодарен за всю хвалу документу, полученную мной за эти годы. Это настоящая моральная поддержка и мне радостно услышать, что он был использован надело добра :-) Спасибо
    1.7. Зеркалирование
    Зеркалирование этого сайта более чем приветствуется, и публичное и приватное. Если вы захотите публично зеркалировать сайт и иметь ссылку на него на главной странице, черкните мне на beej@beej.us
    1.8. Замечания для переводчиков Если вы хотите перевести руководство на другой язык напишите мне на beej@beej.us и я поставлю ссылку на ваш перевод на главной странице. Не смущайтесь добавить ваше имя и контакты в перевод. Пожалуйста, обратите внимание на лицензионные ограничения в разделе 1.9.
    Копирайт и распространение ниже. Если вы хотите разместить переводу меня, просто попросите. Я также поставлю на него ссылку. Любой способ замечателен.
    1.9. Копирайт и распространение
    Beej's Guide to Network Programming is Copyright © 2012 Brian “Beej Jorgensen” Hall.
    3
    http://tangentsoft.net/wskfaq/
    5
    http://www.catb.org/

    esr/faqs/smart-­‐questions.html
    6

    Beej's Guide to Network За особыми исключениями для исходного кода ниже и переводов эта работа лицензирована Creative Commons Attribution-Noncommercial-No Derivative Works 3.0
    License. Чтобы посмотреть копию этой лицензии посетите http://creativecommons.org/licenses/
    by-nc-nd/3.0/ или напишите в Creative Commons, 171 Second Street, Suite 300, San
    Francisco, California, 94105, USA. Одно особое исключение для части “No Derivative Works” лицензии таково это руководство может быть свободно переведено на любой язык при соблюдении точности и полноты перевода. Одинаковые ограничения налагаются и на переводи на исходное руководство. Перевод может также включать имя и контактную информацию переводчика. Представленный в этом документе исходный C код предоставляется в публичное пользование и полностью свободен от каких-либо лицензионных ограничений. Преподаватели могут свободно рекомендовать или предоставлять копии этого руководства своим студентам. Для информации свяжитесь с beej@beej.us
    4

    Beej's Guide to Network Programming
    2. Что такое сокет? Вы всё время слышите разговоры о “сокетах” и наверное даже удивляетесь что же они такое А они это способ общения с другими программами с использованием стандартных дескрипторов файлов Unix. Что Хорошо, может быть вы слышали утверждение некоторых хакеров от Unix, Здорово В
    Unix всё - это файл. Всё, о чём они говорят, это факт, когда программа выполняет любую операцию ввода/вывода, она делает это чтением или записью в дескриптор файла. Дескриптор файла это обыкновенное целое число, связанное с открытым файлом. Но (и здесь прикол, этим файлом может быть сетевое подключение, FIFO, конвейер, терминал, реальный файл на диске и всё что угодно. В Unix всё есть файл Так что лучше поверьте, если вы захотите связаться с другой программой через Интернет, это надо делать через дескриптор файла. Где мне взять этот дескриптор файла, мистер Умник сейчас это, наверное, последний вопросу вас на уме, ноя на него отвечу. Вы вызываете системную программу
    socket(). А она возвращает дескриптор сокета ивы связываетесь через него, используя специальные вызовы сокета send() и recv() (man send, man recv). Вы можете воскликнуть - Постойте Если это дескриптор файла, то почему, именем Нептуна, я не могу воспользоваться для связи нормальными вызовами read() и
    write()?” Короткий ответ - Можете. Ответ подлиннее - Можете, но send() и предоставляют намного больше возможностей управления передачей данных. Что дальше Как насчёт такого сокеты бывают самые разные. Есть DARPA Интернет Адреса (Internet Sockets), путевые имена в локальном узле (Unix Sockets), CCITT X.25 адреса (X.25 Sockets которые вы можете спокойно игнорировать) и множество других в зависимости от вида используемой Unix. Этот документ касается только первого вида интернет сокетов.
    2.1. Два типа интернет сокетов Что такое Есть два типа интернет сокетов? Да. Ладно, нет, вру. Существует множество типов, ноя не хочу вас пугать. Я собираюсь здесь говорить только о двух из них. Помимо этого я хочу сказать, что Сырые Сокеты” (Raw Sockets) также очень мощные ивы должны их просмотреть. Хорошо, начинаем. Что за два типа Один это Потоковые сокеты” (Stream Sockets), другой - “Дейтаграммные сокеты” (Datagram Sockets), на которые можно ссылаться как
    “SOCK_STREAM” и, соответственно. Дейтаграммные сокеты иногда называют “неподключаемыми” (без установки логического соединения, хотя если очень хочется их можно подключить ом. (См. ниже. Потоковые сокеты это надёжные подключаемые двунаправленные потоки связи. Если вы отправите в сокет два послания в порядке “1, 2”, тона другой стороне они также появятся в порядке “1, 2”. Они также будут свободными от ошибок (error-free). Я в этом так уверен, что могу заткнуть себе уши пальцами и напевать ля-ля-ля если кто-нибудь будет утверждать обратное. Что использует потоковые сокеты? Ну, вы наверное слышали о
      1   2   3   4   5   6   7   8   9   ...   13


    написать администратору сайта