Что такое сокет в сети

Что такое сокет в сети

CPM723-01: Рекомендации к применению

Сопроводительные документы

Сокеты и стек протоколов TCP/IP

Рис. 1. Пример протоколов стека TCP/IP в соответствии с моделью OSI

В распределенных системах управления обмен данными является одним из ключевых моментов работы системы. Контроллер CPM723-01 позволяет отправлять и получать данные по промышленному протоколу Modbus TCP на базе протокола TCP/IP с использованием двух портов Ethernet и по протоколу Modbus RTU/ACSII на базе последовательных сетей RS-485/ RS-232 с помощью коммуникационных модулей NIM741/NIM742. Кроме того, система исполнения контроллера CPM723-01 поддерживает механизм сетевого обмена данными между контроллерами, принадлежащими одной подсети, средствами специального протокола прикладного уровня CODESYS V3.

Иногда возникает необходимость использовать протоколы низкого уровня, которые позволяют обмениваться большим количеством сообщений с помощью стека TCP/IP. Также, на базе них можно создавать протоколы более высокого уровня модели OSI (рис. 1).

Взаимодействие между устройствами в рамках стека TCP/IP осуществляется с помощью связки IP адреса и порта.

Для заданияIP адресав настоящее время чаще всего используется протокол IPv4. Для него IP-адрес записывается в виде 32-битной формы, представляемой в символьной форме mmm.nnn.ppp.qqq: адрес, разбитый на четыре поля, разделённых точками, по одному байту в поле, например, 192.168.102.101. Номер порта задается в диапазоне от 0 до 65535.

Пара адрес и порт образует сокет (с английского socket – «гнездо»). Сокет – является программным интерфейсом, который обеспечивает обмен данными между устройствами на низком уровне (рис. 2).

Рис. 2. Общение с помощью сокетов.

Протокол TCP/IP основывается на соединениях, устанавливаемых между двумя компьютерами, обычно называемых клиентом и сервером. Поэтому, различают сокет клиента и сокет сервера. Для организации общения клиент должен знать IP адрес и номер порта сервера, по которым он подключается к удаленному устройству. в рамках стека протоколов TCP/IP различают два типа сокетов TCP и UDP. Также, TCP сокеты называют потоковыми, а UDP – датаграммными.

Протокол TCP/IP основывается на соединениях, устанавливаемых между двумя компьютерами, обычно называемых клиентом и сервером. Поэтому, различают сокет клиента и сокет сервера. Для организации общения клиент должен знать IP-адрес и номер порта сервера, по которым он подключается к удаленному устройству. в рамках стека протоколов TCP/IP различают два типа сокетов TCP и UDP. Также, TCP сокеты называют потоковыми, а UDP – датаграммными.

TCP сокеты

TCP сокеты используют TCP-соединения, в которых на транспортном уровне (рис. 1) обеспечивается надёжная доставка данных. TCP протокол отвечает за установление и поддержание соединения, сегментацию, доставку и буферизацию данных, упорядочивание и избавление от дублированных TCP-сегментов данных, контроль ошибок и скорости передачи. Схема работы простого TCP сокета представлена на рисунке 3.

Для удобства в качестве функций, указанных на диаграмме, используются функции, из системной библиотеки SysSocket 3.х.x.x, которая позволяет создавать сокеты на устройствах, поддерживающих платформу CODESYS V3 в том числе на контроллере CPM723-01 модульной линейки Fastwel I/O.

Cерверный TCP сокет

Рассмотрим работу серверного сокета (рис. 3). Будем считать, что существует отдельная программа, исполняемая в контроллере, которая организует обмен данными с помощью сокетов.

Рис. 3. Работа простого TCP сокета

Инициализация сокета

При старте программы происходит инициализация сервера. С помощью функции SysSockCreate() создается системный идентификатор (handle) сокета. Данная функция в качестве входных параметров принимает аргументы, задающие тип и протокол сокета. Для использования TCP протокола функция SysSockCreate() должна принимать следующие входные аргументы:

Далее сокет сервера привязывается к определенному IP-адресу и порту с помощью функции SysSockBind() . Для привязки к определенному IP-адресу функция SysSockBind() ссылается на структуру SOCKADDRESS , в которой хранятся заданный адрес сокета для привязки.

После успешной привязки к адресу функция SysSockListen() включает прослушивание входящих соединений (ожидание подключений клиентов к серверу). Функцией SysSockListen() также определяется максимальное количество подключений к серверу. Например, если максимальное количество подключений равно 3, и если 3 клиента уже подключились к серверу, то 4-тому будет отказано в подключении.

Обмен данными

После того как сервер включает режим прослушивания, он переходит в рабочий режим и ждет входящие соединения от клиентов. Как только клиент подключается к сокету сервера, с помощью функции SysSockAccept() создается системный идентификатор клиентского сокета hclientSocket и соединение считается открытым:

Серверный сокет принимает сообщения с помощью функции SysSockRecv() :

Затем отправляет данные с помощью функции SysSockSend() :

Обработка новых подключений

После успешных приема и передачи данных может быть реализовано несколько вариантов поведения программы:

  • 1. Программа может закрыть клиентское соединение. В таком случае, в следующих циклах программы сервер будет ожидать подключения с новым клиентом. Такой режим работы не является эффективным, так как контроллеру придется во время каждого цикла закрывать клиентское соединение и подключать нового (или того же самого что и в предыдущем цикле) клиента.
  • 2. Программа может не закрывать клиентский сокет, а сохранить установленное соединение. В таком случае, один раз установив соединение, клиент будет постоянно отправлять и получать данные от сервера. Такой режим работы более эффективный, но может возникнуть ситуация, когда все клиентские соединения будут заняты, и новый клиент не сможет подключиться к серверу. Решить данную ситуацию можно различными способами. Один из вариантов – следить за последним временем активности клиентских сокетов, и отключать самое старое соединение в случае, если в очереди обнаружился новый клиент (рис. 4).

Рис. 4. Обработка подключения нового клиента

Закрытие соединения

В рабочем режиме работы серверный сокет всегда остается открытым. Закрытие серверного сокета может происходить при внешнем событии, или при возникновении критических ошибок. Ошибки при создании и работе сокетов отображаются в системном идентификаторе result, который имеет тип структуры RTS_IEC_RESULT. Обозначение кодов ошибок описано в системной библиотеке CmpErrors Interfaces в глобальных константах Errors (рис. 5).
Для закрытии сокетного соединения используется фукнция SysSockClose() :

Рис. 5. Расшифровка кодов ошибок работы сокетов

Клиентский TCP сокет

Схема работы клиентского сокета отображена на рисунке 3 справа.

Инициализация клиента

Функция SysSockCreate() создает системный идентификатор сокета. Также, как и для сервера, для клиента необходимо создать потоковый сокет:

Зная IP-адрес и порт сервера, клиент с помощью SysSockConnect() подключается к серверному сокету:

Обмен данными

Обмен данными между клиентом и с помощью функций SysSockSend() и SysSockRecv() :

Закрытие соединения

После обмена данными сокет может быть закрыт с помощью с помощью SysSockClose() :

Однако, с точки зрения циклического обмена данными реального времени, каждый раз закрывать и открывать сокет заново неэффективно. Поэтому после успешной установки соединения обмен данными осуществляется в бесконечном цикле.

Особенности сокетов TCP

Использование TCP сокетов позволяет приложениям клиента и сервера обмениваться данными почти прозрачно, не заботясь о поддержании сетевого соединения, доставке пакетов по сети, порядке передачи пакетов и буферизации. TCP сокеты гарантируют доставку сообщений и правильный порядок пакетов, а также пересылают пакеты повторно, если подтверждение о передаче не приходит в течение определенного промежутка времени. Таким образом, использовать TCP сокеты уместно там, где необходима гарантированная доставка данных сетевыми средствами.

Несмотря на многие преимущества, TCP сокеты имеют и негативные стороны. Например, необходимость поддержания TCP-соединения уменьшает пропускную способность обмена данными в распределенных системах. Также, в системах обмена данными реального времени повторная передача потерянных пакетов может привести к тому, что система получит данные, которые утратили свою актуальность.

UDP сокеты

Все перечисленные недостатки TCP сокетов связаны с особенностью TCP-протокола. Если в системе присутствие данных факторов крайне нежелательно, а гарантированность доставки сообщений не является критичным требованием, то в качестве альтернативы TCP сокетов могут использоваться UDP (датаграммные) сокеты.

UDP сокеты устроены проще, чем TCP. В качестве транспортного уровня используется протокол UDP, который не требует установления соединения и подтверждения приема. Информация пересылается в предположении, что принимающая сторона ее ожидает. Датаграммные сокеты не контролирует ничего, кроме целостности полученных датаграмм. Несмотря на это, UDP сокеты нашли свое применение в системах, где на первом месте стоит именно актуальность данных и их быстрая доставка, а не гарантия доставки каждого сообщения.

Например, сервер в ответ на запросы клиента передает по сети текущие (мгновенные) значения некоторого параметра контролируемого технологического процесса, а клиент формирует управляющий сигнал на основе принятых значений. Если темп опроса сервера клиентом много больше требуемого времени реакции алгоритма управления на изменение значения контролируемого параметра, то потеря одного-двух сообщений от сервера несущественно повлияет на качество формирования управляющего сигнала. В случае использования TCP соединения потерянное сообщение будет автоматически передано повторно, что может привести к получению клиентом неактуального значения контролируемого параметра и к формированию неправильного управляющего сигнала.

Серверный UDP сокет

На рисунке 6 показана схема работы простого UDP сокета.

Инициализация сервера

Также, как в случае TCP сокетов, системный идентификатор UDP сокета создается с помощью функции SysSockCreate() :

После создания сокет сервера привязывается к определенному IP-адресу и порту с помощью функции SysSockBind() . В отличие от TCP, UDP сокет не включает прослушивание входящих соединений, а сразу подготавливается к получению данных по сети:

Обмен данными

Для получения данных по UDP сокетам используется функция SysSockRecvFrom() (в отличие от SysSockRecv() для TCP сокетов). Ее главная особенность в том, что она не просто принимает данные от клиента, но и записывает адрес и порт клиента в специальную структуру для хранения адреса SOCKADDRESS , чтобы в дальнейшем сервер знал, куда отправлять ответное сообщение:

Рис. 6. Схема работы простого UDP сокета.

Ответное сообщение отправляется с помощью SysSockSendTo() , которая аналогична SysSockSend() для TCP протокола, но в качестве аргумента принимает ссылку на адрес структуры SOCKADDRESS , где хранится записанный ранее адрес клиента:

Закрытие соединения

После отправки данных, сокет сервера снова переходит к функции SysSockRecvFrom() и остается незакрытым.

Но в случае необходимости серверный сокет можно закрыть аналогично TCP сокету:

Клиентский UDP сокет

Клиент UDP работает аналогично клиентскому сокету TCP за исключением использования функций SysSockSendTo() и SysSockRecvFrom() для отправки и получения сообщений.

Инициализация клиента

Функция SysSockCreate() создает системный идентификатор сокета. Также, как и для сервера, для клиента необходимо создать потоковый сокет:

Обмен данными

В отличие от TCP сокетов, при использовании UDP протокола клиентский сокет не устанавливает соединения с сервером, а сразу после создания клиентского сокета переходит к обмену данными с помощью функций SysSockSendTo() и SysSockRecvFrom() :

bytesRecv:=SysSockRecvFrom(hClientSocket, ADR(recvMessage), 256, 0, ADR(clientAddress), SIZEOF(clientAddress), ADR(result));
// hClientSocket — системный идентификатор сокета сервера;
// bytesRead, bytesRecv – количество полученных и отправленных байт;
// В случае ошибки возвращается 0;
// ADR(clientAddress) – указатель на структуру SOCKADDRESS, в которую запишется адрес клиента;
// ADR(result) – указатель на идентификатор результата

Закрытие соединения

После обмена данными сокет может быть закрыт с помощью с помощью SysSockClose() :

Однако, с точки зрения циклического обмена данными реального времени, каждый раз закрывать и открывать сокет заново неэффективно. Поэтому после успешной установки соединения обмен данными осуществляется в бесконечном цикле.

Дополнительные настройки сокетов

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

Блокирующий режим

По умолчанию, некоторые функции библиотеки SysSocket являются блокирующими. Это значит, что вызов функции не возвращает управление коду, до тех пор, пока он не выполнится. Блокирующими функциями являются SysSockAccept() , SysSockSend() , SysSockRecv() , SysSockSendTo() , SysSockRecvFrom() и так далее.

Например, сервер включает прослушивание входящих соединений с помощью неблокирующей функции SysSockListen() , сразу после которой идет вызов SysSockAccept() . И до тех пор, пока в очереди установленных соединений не появится хотя бы одно подключение, программа не будет исполняться дальше. Такой режим работы также называется синхронным.

Естественно, такое поведение программы не является безопасным, и при циклическом вызове программы в ПЛК может сработать сторожевой таймер или произойти выход в безопасный режим – контроллер будет считать, что программа зависла.

Для того чтобы использовать функции в неблокирующем режиме, необходимо после создания сокета SysSockCreate() вызвать функцию SysSockIoctl() с входным аргументом SOCKET_FIONBIO , которая является командой перевода сокета в неблокирующий режим. При неблокирующим (асинхронном) режиме функция возвращает управление программе вне зависимости от того, закончена операция приема/передачи или нет:

Также, дополнительные настройки работы сокета можно сделать с помощью функции SysSockSetOptions() . Например, включить возможность повторного использования порта:

Подключение несколько клиентов

Серверный сокет, работающий согласно схемам на рисунках 3 и 6, подходит для обмена данными в режиме точка-точка, когда существует одно входящее клиентское соединение. В случае если к серверу будет подключаться несколько клиентов, может возникнуть путаница с принимаемыми и отправляемыми сообщениями, а также может возникнуть очередь на ожидание подключения.

Для того чтобы эффективно работать с несколькими клиентами, используется функция SysSockSelect() . Данный метод проверяет состояние нескольких идентификаторов сокетов одновременно. Сокеты можно проверять на готовность к чтению, записи или на наличие исключительных ситуаций, то есть ошибок.

Если хотя бы один сокет клиента готов, например, к отправке данных, SysSockSelect() сообщит об этом программе и соединение с данным клиентом будет установлено. Схема работы серверного сокета с использованием SysSockSelect() показана на рисунке 5.

Функция SysSockSelect() является блокирующей, она возвращает управление, если хотя бы один из проверяемых сокетов готов к выполнению соответствующей операции. Но в качестве настройки в функции можно указать интервал времени, по прошествии которого она вернет управление в любом случае.

Рис. 7. Схема работы сокетов с использованием функции SysSockSelect()

Программа сокетов для CPM723

В проектах TCP_UDP_Sockets.project и 2xPLCs_Sockets.project, входящих в комплект поставки программного обеспечения Fastwel I/O, реализованы программы TCP сокетов и UDP сокетов на языках ST и CFC стандарта МЭК 61131-3.

Структура проекта TCP_UDP_Sockets.project указана на рисунке 8. В данном проекте реализовано два проекта для UDP и TCP сокетов, для работы в рамках одного контроллера CPM723-01. В первом проекте CPM723_LOCAL_CFC работа сокетов реализована с помощью функциональных блоков, вызываемых в программах (язык CFC). Во втором проекте CPM723_LOCAL_ST работа сокетов реализована в программах (язык ST).

Рис. 8. Структура проекта TCP_UDP_Sockets.project

В проекте 2xPLCs_Sockets.project реализован пример для двух контроллеров CPM723-01, обменивающихся данными по протоколу TCP. На первом контроллере ClientsTCP реализованы TCP сокеты клиентов, на втором контроллере ServerTCP – TCP сокет сервера. Структура проекта указана на рисунке 9.

Рис. 8. Структура проекта TCP_UDP_Sockets.project

Заключение

Сокеты отвечают за обмен данными между различными устройствами и процессами. На базе обмена данными по сокетам можно создавать протоколы стека TCP/IP более высокого уровня.

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

Термин «сокет» представляет собой пассивную часть параметров процессора, но в то же время является важным показателем при сборке системы. В этом материале будет разобрано понятие сокет, а также будут приведены примеры популярных из них для процессоров от Intel и AMD.

Что представляет собой сокет?

Простыми словами, сокетом является небольшой разъём на материнской плате, где впоследствии осуществляется установка процессора. Когда речь идёт о «сокете процессора», то имеют в виду не только имеющийся разъём, но и поддержку этого элементами многими известными процессорами. Этот компонент понадобится для лёгкой замены процессора, если вдруг тот выйдет из строя, либо для апгрейда системы более мощным CPU. Сокеты по своей части могут иметь разное число контактов, их видов, расстояние между креплениями и другие параметры, которые, так или иначе, будут совместимы с тем или иным процессором. Есть также и технологические изменения: множество разных контроллеров, поддержание интегрированной графики в CPU, показатели производительности и многое другое.

Сокет для процессора на материнской плате

Именно поэтому выбор нужного сокета является важным моментом при сборке компьютера. Если выбран процессор, который не подходит под имеющийся сокет, то чип просто не войдет в разъём ввиду своей несовместимости. Такие эксперименты лучше не проводить вообще, так как есть вероятность повредить некоторые контакты, в результате привести систему к нерабочему состоянию. Поэтому перед тем как покупать материнскую плату, нужно, предварительно подобрать процессор, а уже под него рассматривать нужную материнку с совместимыми разъёмами.

Посмотреть, поддерживается тот или иной процессор для материнки или нет, можно на официальном сайте самой материнской платы. В таком случае можно быть точно уверенным, что выбранные устройства окажутся совместимыми. Ниже будут рассмотрены популярные модели сокетов от двух известных производителей – АМД и Интел.

Сокеты Intel

Процессоры от этого производителя имеют высокую динамику обновлений, в отличие от известного AMD. Недавно были выпущена серия процессоров, имеющая несколько сокетов, которые между собой были несовместимыми.

Здесь есть положительная и отрицательная сторона ситуации. С одной стороны, это хорошо, так как увеличивается производительность CPU и практически под каждую модель создаётся свой специфический сокет. Но, с другой стороны, сделать апгрейд в таком случае очень сложно, так как новые процессоры имеют свои разъёмы, поэтому если их и менять, то делать это нужно вместе с материнской платой, что будет, не очень удобно, а главное, дорого.

Какие же модели можно рассматривать и чем они характеризуются?

  1. Socket LGA 2011. Модель прекрасно работает с различными процессорами на архитектуре Ivy Bridge от Intel (Core i3, i5, i7). Изначально сокет использовался в качестве маркетингового хода, чтобы встрясти положение на рынке, и повысить стоимость на процессоры для него. Это было в первое время, затем стоимость таких процессоров упала. Однако на материнках с этим сокетом это не отразилось и стоимость их так, и осталась высокой в отличие от вариантов, которые будут рассмотрены ниже.
  2. Socket LGA 1356, 1155, 1156. Эти модели применимы только для одной архитектуры Sandy Bridge 2, хоть и являются несовместимыми между собой. Наиболее эффективным оказалась модель 1155, которую использовали для большей части систем. Сокет 1366 был создан для мощнейших станций, который также отлично себя показал в работе.

Socket LGA 1155

  • Socket LGA 775. В некоторых системах они всё ещё используются, однако, стоит отдать должное, они уже сильно устарели. Системы, в которых можно их увидеть: Celeron, Core 2 Quad и Duo.
  • Сокеты AMD

    Этот производитель в своих решениях был более консервативен. Между многими сокетами есть совместимость, благодаря устроенным сериям «+». К примеру, сокет АМ3 будет совместимым с АМ3+, в результате для пользователей открываются большие возможности по апгрейду, что является хорошим преимуществом. Однако такое топтание непозволительно для IT-направления.

    Некоторые модели сокетов от AMD.

      Socket АМ3 и АМ3+. По специфике эти две модификации являются совместимыми друг с другом. Такие сокеты отлично подойдут для некоторых моделей CPU: Phenom, FX и Athlon 2. Сокеты для мощных процессоров сначала не оправдали ожиданий, однако, после спада цен устроили пользователей ввиду низкой стоимости и хорошей производительности. Эти две модификации сейчас хорошо используются как среди дешёвых систем, так и дорогих, что доказывает хороший уровень практичности этих моделей.

    Socket АМ3+

  • Socket АМ2 и АМ2+. Эти модели сейчас являются несколько устаревшими, однако, используются еще во многих системах. Разрабатывались они для CPU: Sempron, Phenom и Athlon.
  • Socket FM1 и FM2. Изначально модификации создавались для процессоров из серии AMD Fusion, однако, впоследствии используются для тех, кто не хочет покупать дискретную карту, но желает иметь интегрированную графику.
  • Таким образом, мы кратко рассмотрели понятие сокета, а также указали его популярные модели для двух процессоров AMD и Intel.

    Delphi , Интернет и Сети , Сокеты

    Что такое сокет

    Мама приходит из аптеки и говорит дочке, которая сидит в чате:
    — Я марганцовку купила.
    — Рулез! — отвечает дочка не отрываясь от компа.
    Мама через 5 минут раздумия:
    — Нет не рулез, а марганцовку!

    Существует мировой стандарт структуры протоколов связи — семиуровневая OSI (Open Systems Interface — интерфейс открытых систем). Hа каждом из уровней этой структуры решается свой объем задач своими методами. Сокеты находятся на так назывемом транспортном уровне — ниже находится сетевой протокол IP, выше — специализированные протоколы сеансового уровня, ориентированные на решение конкретных задач — это всем известные FTP, SMTP, etc.

    Если смотреть по сути, сокет — это модель одного конца сетевого соединения, со всеми присущими ему свойствами, и, естественно — возможностью получать и передавать данные. По содержанию — это прикладной программный интерфейс, входящий в состав многих ОС. В семействе Windows — начиная с версии 3.11, и носит название WinSock. Прототипы функций WinSock API находятся в файле winsock.pas. В Delphi есть полноценная инкапсуляция клиентского и серверного сокетов, представленная компонентами TClientSocket и TServerSocket, находящимися на закладке Internet.

    Сокеты не обязательно базируются на протоколе TCP/IP, они могут также базироваться на IPX/SPX, etc.

    Также Вам следует ознакомиться со списком зарезервированных номеров портов.

    Механизм взаимодействия сокетов таков. С одной из двух сторон запускается серверный сокет, который сразу после запуска находится в режиме прослушивания (listening), точнее — ожидания запросов от клиентов. После получения запроса от клиента устанавливается связь, и создается новый экземпляр серверного сокета.

    Так как работа с сокетами, это, по сути — операции ввода/вывода, которые бывают синхронными или асинхронными, то и тип работы сокета обладает бывает синхронным или асинхронным. Компоненты TClientSock и TServerSock поддерживают оба режима работы.

    Дополнение от Анатолия Подгорецкого:

    Когда говорят СОКЕТ то часто не представляют, что это такое. Можно говорить об моделях, об реализациях и так далее. о есть одно простое толкование, применимое для протокола IP. Как известно для взаимодействия между машинами по протоколу IP используются адреса и порты.

    Первое на текущий момент представляют из себя 32-x битный адрес, наиболее часто его представляют в символьной форме mmm.nnn.ppp.qqq (адрес разбитый на четыре октета по одному байту в октете и разделеный точками) .

    Второе — это номер порта в диапазоне от нуля до 65535

    Так вот эта пара и есть сокет (гнездо в в котором расположены адрес и порт).

    В процессе обмена как правило используются два сокета — сокет отправителя и сокет получателя.

    апример при обращении к моему серверу на HTTP порт сокет будет выглядеть так: 194.106.118.30:80, а ответ будет поступать на mmm.nnn.ppp.qqq:xxx

    Статья Что такое сокет раздела Интернет и Сети Сокеты может быть полезна для разработчиков на Delphi и FreePascal.

    Комментарии и вопросы

    Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.

    Ссылка на основную публикацию
    Что означает ошибка 110
    Ошибка 110 в Android происходит главным образом при обновлении или установке приложений из Google Play. Случается это из-за несовместимости ОС:...
    Что выбрать windows 7 или windows 10
    Сегодня в нашем блоге «Чо?! Чо?!» я раскрою все преимущества и недостатки новой операционной системы для ноутбуков, сравнив ее с...
    Что в китае дешевле чем в россии
    Я экономлю тысячи рублей, покупая товары из Китая через интернет Сегодня я расскажу Вам о том, что выгодно покупать в...
    Что означает ошибка 963
    Ошибки в Google Play дело достаточно частое, это не удивительно, ведь Плей маркет – это один из крупнейших магазинов приложений....