Какая библиотека используется для работы с сокетами
Перейти к содержимому

Какая библиотека используется для работы с сокетами

  • автор:

Сокеты Windows в MFC

MFC поддерживает сокеты Windows 1, но не поддерживает сокеты Windows 2. Сокеты Windows 2 впервые поставляется с Windows 98 и является версией, включенной в Windows 2000.

MFC предоставляет две модели для написания сетевых программ связи с сокетами Windows, воплощенными в двух классах MFC. В этой статье описаны эти модели и дополнительные сведения о поддержке сокетов MFC. «сокет» — это конечная точка связи: объект, через который приложение взаимодействует с другими приложениями сокетов Windows в сети.

Сведения о сокетах Windows, включая описание концепции сокета, см. в разделе «Сокеты Windows: фон».

Модели программирования сокетов

Две модели программирования сокетов Windows MFC поддерживаются следующими классами:

  • CAsyncSocket Этот класс инкапсулирует API сокетов Windows. CAsyncSocket предназначен для программистов, которые знают сетевое программирование и хотят гибкости программирования непосредственно в API сокетов, но также хотят удобства функций обратного вызова для уведомления о сетевых событиях. Кроме упаковки сокетов в объектно-ориентированной форме для использования в C++, единственная дополнительная абстракция этого класса преобразует определенные сообщения Windows, связанные со сокетами, в обратные вызовы. Дополнительные сведения см. в статье «Сокеты Windows: уведомления сокетов».
  • CSocket Этот класс, производный от CAsyncSocket , предоставляет более высокий уровень абстракции для работы с сокетами через объект CArchive MFC. Использование сокета с архивом значительно напоминает протокол сериализации файлов MFC. Это упрощает использование, чем CAsyncSocket модель. CSocket наследует многие функции-члены от CAsyncSocket этого инкапсулирования API сокетов Windows; вам придется использовать некоторые из этих функций и понимать программирование сокетов в целом. Но CSocket управляет многими аспектами взаимодействия, которые необходимо сделать самостоятельно с помощью необработанного API или класса CAsyncSocket . Самое главное, CSocket обеспечивает блокировку (с фоновой обработкой сообщений Windows), что важно для синхронной операции CArchive .

Библиотеки DLL сокетов Windows

Операционные системы Microsoft Windows предоставляют библиотеки динамических ссылок (DLL). Visual C++ предоставляет соответствующие файлы заголовков и библиотеки и спецификацию сокетов Windows.

Дополнительные сведения о сокетах Windows см. в следующем разделе:

  • Сокеты Windows. Сокеты потоков
  • Сокеты Windows. Сокеты датаграмм
  • Сокеты Windows. Использование сокетов с архивами
  • Сокеты Windows. Последовательность операций
  • Сокеты Windows. Пример сокетов с использованием архивов
  • Сокеты Windows. Работа сокетов с архивами
  • Сокеты Windows. Использование класса CAsyncSocket
  • Сокеты Windows. Наследование от классов сокета
  • Сокеты Windows. Уведомления сокетов
  • Сокеты Windows. Блокировка
  • Сокеты Windows. Порядок байтов
  • Сокеты Windows. Преобразование строк
  • Сокеты Windows. Порты и адреса сокета

Введение в сетевое программирование. Сокеты.¶

Сокет — это программный интерфейс для обеспечения информационного обмена между процессами.

  • Серверный — сокет, который принимает сообщения.
  • Клиентский — сокет, который отправляет сообщения.
  • Потоковые (на основе TCP, в коде обозначаются SOCK_STREAM ) — сокеты с установленным соединением на основе протокола TCP, передают поток байтов, который может быть двунаправленным — т.е. приложение может и получать и отправлять данные.
  • Дейтаграммные (на основе UDP, в коде обозначаются SOCK_DGRAM ) — сокеты, не требующие установления явного соединения между ними. Сообщение отправляется указанному сокету и, соответственно, может получаться от указанного сокета.

Сокет состоит из IP-адреса и порта.

IP-адрес — уникальный сетевой адрес узла в компьютерной сети, построенной по протоколу IP. В версии протокола IPv4 IP-адрес имеет длину 4 байта (например, 192.168.0.3), а в версии протокола IPv6 IP-адрес имеет длину 16 байт (например, 2001:0db8:85a3:0000:0000:8a2e:0370:7334). IP-адрес должен быть уникален.

Порт — натуральное число, записываемое в заголовках протоколов транспортного уровня (TCP, UDP и др.). Порт используется для определения процесса-получателя пакета в пределах одного хоста.

В python для работы с сокетами используется встроенная библиотека socket . Одной из основных функций модуля является функция socket() , которая возвращает объект типа сокет, обладающий соответствующими функциями для работы с соединением.:

class socket.socket sock = socket.socket() 
  • socket.bind(address) — Привязывает сокет к адресу address (инициализирует IP-адрес и порт). Сокет не должен быть привязан до этого.
  • socket.listen([backlog]) — Переводит сервер в режим приема соединений. Параметр«backlog (int)« – количество соединений, которые будет принимать сервер.
  • socket.accept() — Принимает соединение и блокирует приложение в ожидании сообщения от клиента. В результате возвращает кортеж:
    • conn : объект соединения (сокет), который можно использовать для отправки/получения данных;
    • address : адрес клиента.

    Работа с сокетом во многом схожа с работой с файловым объектом. Принцип — открыли соединение — считали данные — закрыли соединение.

    Создание серверного сокета: .. code

    import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # создаем сокет sock.bind(('', 55000)) # связываем сокет с портом, где он будет ожидать сообщения sock.listen(10) # указываем сколько может сокет принимать соединений print('Server is running, please, press ctrl+c to stop') while True: conn, addr = sock.accept() # начинаем принимать соединения print('connected:', addr) # выводим информацию о подключении data = conn.recv(1024) # принимаем данные от клиента, по 1024 байт print(str(data)) conn.send(data.upper()) # в ответ клиенту отправляем сообщение в верхнем регистре conn.close() # закрываем соединение 

    Создание клиентского сокета: .. code

    import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # создаем сокет sock.connect(('localhost', 55000)) # подключемся к серверному сокету sock.send(bytes('Hello, world', encoding = 'UTF-8')) # отправляем сообщение data = sock.recv(1024) # читаем ответ от серверного сокета sock.close() # закрываем соединение print(data) 

    Обратите внимание, клиент отправляет байтовую строку, а не обычную. Сервер так же принимает в качестве сообщения байтовую строку и должен в ответе вернуть объект того же типа.

    Задания¶

    1. Реализовать чат без графического интерфейса, который позволит обмениваться сообщениями только между клиентом и сервером. Клиент должен получать сообщения сервера в том числе.
    2. С помощью модуля easygui (см. полезные ссылки), добавьте в разработанный чат простой графический интерфейс.
    3. Разработайте приложение, которое будет запрашивать у пользователя название файла, а затем отправлять содержимое этого файла серверу. Сервер будет подсчитывать количество слов и возвращать ответ.
    4. Добавьте к чату из задачи 2 чат-бота на стороне сервера. Добавьте 4-5 фраз, которые сервер будет отправлять по определённым условиям.

    Полезные ссылки:¶

    1. Easygui
    2. Файловый ввод-вывод
    3. Работа с файлами в Python

    © Copyright Revision d00c0df4 .

    Built with Sphinx using a theme provided by Read the Docs.
    Read the Docs v: latest

    Versions latest Downloads html On Read the Docs Project Home Builds Free document hosting provided by Read the Docs.

    библиотека для TCP/IP сокет подключений

    Собственно, порекомендуйте, пожалуйста, библиотеку для TCP/IP сокет.

    А, да, условие: поддержка GNU/Linux, MS Windows

    sniper21 ★★★★★
    15.01.18 19:41:44 MSK
    Последнее исправление: sniper21 15.01.18 21:41:00 MSK (всего исправлений: 2)

    напиши еще свой язык программирования, потому что это главный фактор

    dave ★★★★★
    ( 15.01.18 19:52:49 MSK )
    Harald ★★★★★
    ( 15.01.18 19:58:22 MSK )
    Ответ на: комментарий от Harald 15.01.18 19:58:22 MSK

    многие дистрибутивы гнулинукса рекомендуют

    Harald ★★★★★
    ( 15.01.18 19:58:38 MSK )
    hippi90 ★★★★★
    ( 15.01.18 19:59:35 MSK )

    Тебе для прожки? А почему не указал язык программирования?

    I-Love-Microsoft ★★★★★
    ( 15.01.18 20:38:10 MSK )
    Ответ на: комментарий от I-Love-Microsoft 15.01.18 20:38:10 MSK
    sniper21 ★★★★★
    ( 15.01.18 21:40:46 MSK ) автор топика
    anonymous
    ( 15.01.18 21:45:13 MSK )
    Ответ на: комментарий от anonymous 15.01.18 21:45:13 MSK

    дык не поддерживается 🙁

    sniper21 ★★★★★
    ( 15.01.18 21:46:29 MSK ) автор топика
    Ответ на: комментарий от sniper21 15.01.18 21:46:29 MSK

    Чем не поддерживается?

    BRE ★★
    ( 15.01.18 21:52:02 MSK )
    Ответ на: комментарий от BRE 15.01.18 21:52:02 MSK
    sniper21 ★★★★★
    ( 15.01.18 21:57:46 MSK ) автор топика
    Ответ на: комментарий от sniper21 15.01.18 21:57:46 MSK

    А если asio в boost поискать? 🙂

    BRE ★★
    ( 15.01.18 22:00:03 MSK )
    Ответ на: комментарий от BRE 15.01.18 22:00:03 MSK

    А Boost жирно для мелкопроекта. cURL’ом значит, только cURL’ом.

    sniper21 ★★★★★
    ( 15.01.18 22:13:45 MSK ) автор топика
    Ответ на: комментарий от BRE 15.01.18 22:00:03 MSK

    а зачем его там искать ?

    dhampire ★★★
    ( 15.01.18 22:49:34 MSK )
    Ответ на: комментарий от sniper21 15.01.18 21:57:46 MSK
    dhampire ★★★
    ( 15.01.18 22:51:42 MSK )

    Qt, boost asio, poco.

    rumgot ★★★★★
    ( 15.01.18 22:57:12 MSK )
    Ответ на: комментарий от dhampire 15.01.18 22:49:34 MSK

    А почему вы спрашиваете?

    anonymous
    ( 15.01.18 22:57:52 MSK )
    Ответ на: комментарий от sniper21 15.01.18 22:13:45 MSK

    Почему жирно? Ты ведь используешь только те части буста, которые тебе требуются.

    rumgot ★★★★★
    ( 15.01.18 22:58:18 MSK )
    Ответ на: комментарий от dhampire 15.01.18 22:49:34 MSK

    Затем, что кроме asio из буста удобно использовать и некоторые другие его библиотеки. А использовать boost и отдельный asio как-то избыточно.

    BRE ★★
    ( 16.01.18 01:59:26 MSK )
    Ответ на: комментарий от sniper21 15.01.18 22:13:45 MSK

    Если не ошибаюсь, то в случае использования boost asio нужно будет доложить в дистрибутив твоей программы примерно три либы, но уже смутно помню, какие

    Посмотри еще библиотеку libev, но все зависит от того способа, как ты обрабатываешь соединения

    dave ★★★★★
    ( 16.01.18 07:47:01 MSK )

    Укажи хотя бы зачем тебе оно. Просто инфу по http тягать, или какой-то свой протокол обмена реализовывать.

    Библиотека с сокетами

    а какие есть в C++ хорошие высокоуровневые библиотеки для работы с неблокирующими сокетами, кроме asio?

    Хочется иметь интерфейс как минимум, как у Qt: получать асинхронное уведомление о том, что из сокета можно прочитать, иметь возможность всегда мгновенно дописать произвольное количество в буфер записи, получить асинхронное уведомление о том, что запись завершилась, диагностировать отваливание второй стороны сокета.

    Смотрел Poco и в нём Socket+React, но как-то совсем не дотягивает (в т.ч. потому что прибито гвоздями к select, и управлять буфером всё равно надо самому). Велосипедить на ev++ не хочется. На awesome-cpp в основном всякие http-серверы упоминаются.

    vzzo ★★★
    02.06.16 23:16:17 MSK

    Хочется иметь интерфейс как минимум, как у Qt

    Ответ будет немного очевиден 🙂

    Stil ★★★★★
    ( 02.06.16 23:26:16 MSK )

    IceWindDale
    ( 02.06.16 23:31:13 MSK )

    А чем asio-то не устроил?

    DELIRIUM ☆☆☆☆☆
    ( 02.06.16 23:34:52 MSK )

    libev, libevent, libuv

    annulen ★★★★★
    ( 03.06.16 00:11:41 MSK )

    Двачую вопрос про «чем asio не угодил?».

    Pavval ★★★★★
    ( 03.06.16 00:58:12 MSK )

    libevent, libev/libeio, libuv, ioxx
    А, ну и glib вроде еще умеет с сокетами в асинхронном completion-oriented стиле работать.

    kravich ★★★★
    ( 03.06.16 07:00:08 MSK )
    Последнее исправление: kravich 03.06.16 07:02:00 MSK (всего исправлений: 2)

    Это ты про libev? Можно и сишный интерфейс использовать. Мне он даже проще показался.

    Тут вопрос такой. Тебе нужен пул потоков?

    Если да, то альтернатив asio возможно и нет, по крайней мере, мне неизвестны (*). Если же ты намерен обрабатывать (множественные) запросы из одного потока, а такое тоже имеет право на жизнь, хотя уровнем по-ниже будет по производительности, отказоустойчивости и т.п., то тогда libev и компания, как перечислили выше.

    (*) в Poco особо не вникал — не хотел тянуть такую зависимость в проект

    dave ★★★★★
    ( 03.06.16 07:50:18 MSK )
    Последнее исправление: dave 03.06.16 07:50:52 MSK (всего исправлений: 1)

    Ответ на: комментарий от dave 03.06.16 07:50:18 MSK

    Можно, конечно, из разных предопределенных потоков обрабатывать запросы, в каждом потоке свои запросы, но тогда почему самому не написать простенькую прослойку над select/poll? Тогда не нужны ни asio, ни libev и компания.

    dave ★★★★★
    ( 03.06.16 07:53:34 MSK )

    хорошие высокоуровневые библиотеки для работы с неблокирующими сокетами, кроме asio?

    no-such-file ★★★★★
    ( 03.06.16 09:02:48 MSK )
    Ответ на: комментарий от no-such-file 03.06.16 09:02:48 MSK

    Использовал в продакшене, проблем не было.

    Oxdeadbeef ★★★
    ( 03.06.16 09:26:53 MSK )

    Если очень привередливый, то лучше написать самому именно такой фреймворк, какой нравится. Я, например, так и поступил.

    pathfinder ★★★★
    ( 03.06.16 12:27:47 MSK )

    получить асинхронное уведомление о том, что запись завершилась, диагностировать отваливание второй стороны сокета.

    факт записи в сокет не очень интересна, а о том что сообщение «там» пришло никак не узнать (я незнаю как), если обратно сам пакет не пришлешь

    отваливание также не узнать быстро, что опять требует свой протокол «запрос»-«ответ»

    а чем qt не устроила ?

    x905 ★★★★★
    ( 03.06.16 14:24:58 MSK )
    Последнее исправление: x905 03.06.16 14:25:41 MSK (всего исправлений: 1)

    Ответ на: комментарий от Stil 02.06.16 23:26:16 MSK

    Да, я тоже думал об этом 🙂 Но сигналы/слоты/moc и QString/QByteArray тянуть во все остальные места программы очень не хочется.

    vzzo ★★★
    ( 03.06.16 14:27:48 MSK ) автор топика
    Ответ на: комментарий от DELIRIUM 02.06.16 23:34:52 MSK

    может, boost?
    А чем asio-то не устроил?
    Двачую вопрос про «чем asio не угодил?».

    В основном нечитаемым синтаксисом. Плюс любопытно изучить другие библиотеки.

    vzzo ★★★
    ( 03.06.16 14:34:24 MSK ) автор топика
    Ответ на: комментарий от kravich 03.06.16 07:00:08 MSK

    Первые три не управляют сокетами, а только событиями. ioxx не видел, сейчас посмотрю.

    vzzo ★★★
    ( 03.06.16 14:35:55 MSK ) автор топика
    Ответ на: комментарий от dave 03.06.16 07:50:18 MSK

    Тут вопрос такой. Тебе нужен пул потоков?

    В непосредственном виде нет. На всё чтение мне точно хватит одного потока, запись иногда будет делаться из другого потока.

    vzzo ★★★
    ( 03.06.16 14:39:15 MSK ) автор топика
    Ответ на: комментарий от no-such-file 03.06.16 09:02:48 MSK

    А есть где-нибудь адекватная документация или примеры, как выглядят асинхронные сокеты на libpoco? Нужно ли самому управлять буферами?

    vzzo ★★★
    ( 03.06.16 14:40:02 MSK ) автор топика
    Ответ на: комментарий от x905 03.06.16 14:24:58 MSK

    факт записи в сокет не очень интересна,

    Факт записи в сокет для меня будет некоторым подтверждением того, что данные не оседают в буферах библиотеки / ОС, а куда-то пытаются уйти. Так как данные инвалидируются в течение нескольких секунд, копить их очередь нет смысла.

    отваливание также не узнать быстро, что опять требует свой протокол «запрос»-«ответ»

    Быстро и не нужно, главное — узнать.

    Да вообще, устраивает всем, кроме того, что я описал в сообщении выше и того, что хочется попробовать что-нибудь новое. Проект скорее игрушечный, так что хочется потратить время с интересом.

    vzzo ★★★
    ( 03.06.16 14:42:38 MSK ) автор топика
    Ответ на: комментарий от vzzo 03.06.16 14:34:24 MSK

    Это в каком месте?

    Pavval ★★★★★
    ( 03.06.16 17:59:00 MSK )
    Ответ на: комментарий от vzzo 03.06.16 14:40:02 MSK

    А есть где-нибудь адекватная документация или примеры, как выглядят асинхронные сокеты на libpoco?

    А на сайте poco посмотреть никак нельзя? Там даже слайды есть, для школьников — http://pocoproject.org/slides/200-Network.pdf

    no-such-file ★★★★★
    ( 03.06.16 20:44:41 MSK )

    Deathstalker ★★★★★
    ( 03.06.16 21:33:05 MSK )

    Есть у меня самописная библиотека на базе epoll (можно на kqueue переделать заменой одного файла), с реализацией HTTP, WebSocket и какой-то другой фигни. Там даже HTML шаблонизатор есть, то есть легко запиливается сайтик с парсингом форм и т.п. Там есть известные мне глюки и костыли (фиксы в «секретной» ветке), но попробовать можно. При написании делался акцент на минимальное копирование данных, хотя в вебсокетной реализации до сих пор живёт не выпиленный дурацкий буфер с лишним копированием. При парсинге HTTP, например, передаю между подпрограммами пару , указывающую на строку во входящем буфере и т.п.

    Пример HTTP сервака на этой либе:

    На этой либе работают:

    Либа пока содержит страшные костыли и грабли в паре неожиданных мест (на тему владения ресурсами), зная про которые в принципе можно избежать выстрела в ногу.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *