Сокеты 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)
Обратите внимание, клиент отправляет байтовую строку, а не обычную. Сервер так же принимает в качестве сообщения байтовую строку и должен в ответе вернуть объект того же типа.
Задания¶
- Реализовать чат без графического интерфейса, который позволит обмениваться сообщениями только между клиентом и сервером. Клиент должен получать сообщения сервера в том числе.
- С помощью модуля easygui (см. полезные ссылки), добавьте в разработанный чат простой графический интерфейс.
- Разработайте приложение, которое будет запрашивать у пользователя название файла, а затем отправлять содержимое этого файла серверу. Сервер будет подсчитывать количество слов и возвращать ответ.
- Добавьте к чату из задачи 2 чат-бота на стороне сервера. Добавьте 4-5 фраз, которые сервер будет отправлять по определённым условиям.
Полезные ссылки:¶
- Easygui
- Файловый ввод-вывод
- Работа с файлами в Python
© Copyright Revision d00c0df4 .
Built with Sphinx using a theme provided by Read the Docs.
Read the Docs v: latestVersions 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 сервака на этой либе:
На этой либе работают:
Либа пока содержит страшные костыли и грабли в паре неожиданных мест (на тему владения ресурсами), зная про которые в принципе можно избежать выстрела в ногу.