Socket server что это

Содержание

Сетевые сокеты — способ взаимодействия любого приложения с системой на которой оно работает. Сокет — это интерфейс, который по сути представляет собой совокупность адреса в сети и используемого порта. Также часто термин употребляется применительно к Socket API, о котором рассказывается во второй части статьи.

Клиентское приложение всегда работает на локальной машине, подключенной к сети

Интерфейс между приложением и хост-машиной (Network-Application Interface) определяет как приложение может использовать сеть.

Сетевые сокеты и клиент серверная модель

Приложение клиента (посылает например URL в случае с вебом или запрос к MySQL) на определенный сетевой адрес и порт. В примере это localhost и порт 3306 — сервер в свою отвечает приложению. К приложению при этом могут обращаться множество клиентов, запросы и использованием сокета приходят на один и тот же адрес и обрабатываются одним пакетом. Таким образом работает клиент-серверая модель взаимодействия.

Чтобы написать приложение, которое могло бы обслуживать множество клиентов (последовательно и параллельно) нужно сокет API

Socket API — интерфейс используемый всеми интернет приложениями.

Socket API при соединении 2-х приложений может работать с потоками и с датаграммами :
  • потоки — отправка потока байтов с гарантированной доставкой
  • датаграммы — отдельные сообщения без грантии доставки

Сетевой сокет — комбинация IP адреса и номера порта, которые представляют собой способ адресации и обеспечивают нормальное взаимодействие большого количества приложений в рамках одной системы.

Один сокет не может использовать два приложения одновременно или два экземпляра одного приложения.

Вызовы в Socket API


SOCKET — вызов создает структуру

BIND — связывает локальный адрес с сокетом

LISTEN — заявляет о готовности установить соединение

ACCEPT — принимает входящее соединение

CONNECT — пробует установить соединение

SEND — отправляет данные в рамках соединения

RECEIVE — принимает информацию в рамках соединения

CLOSE — прерывает соединение

уПЛЕФ — ХУФТПКУФЧП ДЧХОБРТБЧМЕООПК УЧСЪЙ, ЛПФПТПЕ НПЦЕФ ЙУРПМШЪПЧБФШУС ДМС ЧЪБЙНПДЕКУФЧЙС У ДТХЗЙН РТПГЕУУПН ОБ ПДОПК Й ФПК ЦЕ НБЫЙОЕ ЙМЙ У РТПГЕУУПН, ЪБРХЭЕООЩН ОБ ДТХЗЙИ НБЫЙОБИ. рТПЗТБННЩ йОФЕТОЕФБ ФБЛЙЕ ЛБЛ Telnet, rlogin, FTP, talk , Й World Wide Web ЙУРПМШЪХАФ УПЛЕФЩ.

оБРТЙНЕТ, НПЦОП РПМХЮЙФШ WWW-УФТБОЙГХ ПФ УЕТЧЕТБ Web, ЙУРПМШЪХС РТПЗТБННХ Telnet , ФБЛ ЛБЛ ПОЙ ПВЕ ЙУРПМШЪХАФ УПЛЕФЩ ДМС УЕФЕЧПЗП ЧЪБЙНПДЕКУФЧЙС. дМС ПФЛТЩФЙС РПДЛМАЮЕОЙС У УЕТЧЕТПН WWW ОБ www.codesourcery.com, ОЕПВИПДЙНП ЙУРПМШЪПЧБФШ telnet www.codesourcery.com 80 . лПОУФБОФБ 80 ПРТЕДЕМСЕФ РПДЛМАЮЕОЙЕ Л Web УЕТЧЕТХ. еУМЙ РПУМЕ ФПЗП, ЛБЛ РПДЛМАЮЕОЙЕ ВХДЕФ ХУФБОПЧМЕОП, РЕТЕДБФШ ЛПНБОДХ get /, ФП Web УЕТЧЕТХ ЮЕТЕЪ УПЛЕФЩ ВХДЕФ ПФРТБЧМЕОП УППВЭЕОЙЕ, ОБ ЛПФПТПЕ ПО ПФЧЕФЙФ, РЕТЕДБЧ ЙУИПДОЩК ФЕЛУФ ДПНБЫОЕК HTML УФТБОЙГЩ Й ЪБФЕН ЪБЛТПЕФ РПДЛМАЮЕОЙЕ.

пУОПЧЩ УПЛЕФПЧ

рТЙ УПЪДБОЙЙ УПЛЕФБ, ОЕПВИПДЙНП ПРТЕДЕМЙФШ ФТЙ РБТБНЕФТБ: УФЙМШ ЧЪБЙНПДЕКУФЧЙС, РТПУФТБОУФЧП ЙНЕО, Й РТФПЛПМ. уФЙМШ ЧЪБЙНПДЕКУФЧЙС ЛПОФТПМЙТХЕФ, ЛБЛ УПЛЕФ ПВТБВБФЩЧБЕФ РЕТЕДБЧБЕНЩЕ ДБООЩЕ, Й ПРТЕДЕМСЕФ ЛПМЙЮЕУФЧП РБТФОЕТПЧ ЧЪБЙНПДЕКУФЧЙС. юЕТЕЪ УПЛЕФЩ ДБООЩЕ РЕТЕДБАФУС ВМПЛБНЙ (РБЛЕФБНЙ). уФЙМШ ЧЪБЙНПДЕКУФЧЙС ПРТЕДЕМСЕФ, ЛБЛ ЬФЙ РБЛЕФЩ ВХДХФ ПВТБВПФБОЩ Й ЛБЛ ПОЙ РЕТЕДБАФУС ПФ ПФРТБЧЙФЕМС Л РПМХЮБФЕМА.

  • уФЙМЙ УПЕДЙОЕОЙС ЗБТБОФЙТХАФ ДПУФБЧЛХ ЧУЕИ РБЛЕФПЧ Ч ФПН РПТСДЛЕ, Ч ЛБЛПН ПОЙ ВЩМЙ ПФРТБЧМЕОЩ. еУМЙ ЧП ЧТЕНС РЕТЕДБЮЙ РБЛЕФЩ ВЩМЙ РПФЕТСОЩ ЙМЙ ДПУФБЧМЕОЩ Ч ОЕРТБЧЙМШОПН РПТСДЛЕ, РПМХЮБФЕМШ БЧФПНБФЙЮЕУЛЙ ПФРТБЧМСЕФ ЪБРТПУ ОБ ЙИ РПЧФПТОХА РЕТЕДБЮХ. уФЙМШ УПЕДЙОЕОЙС ОБРПНЙОБЕФ ФЕМЕЖПООЩК ЪЧПОПЛ: БДТЕУБ ПФРТБЧЙФЕМС Й РПМХЮБФЕМС ЖЙЛУЙТХАФУС Ч ОБЮБМЕ УПЕДЙОЕОЙС, РТЙ ХУФБОПЧЛЕ РПДЛМАЮЕОЙС.
  • уФЙМЙ ДБФБЗТБН ОЕ ЗБТБОФЙТХЕФ ДПУФБЧЛЙ Й РТБЧЙМШОПЗП РПТСДЛБ РТЙВЩФЙС. рБЛЕФЩ НПЗХФ ВЩФШ РПФЕТСОЩ ЙМЙ РЕТЕХРПТСДПЮЕОЩ Ч РХФЙ ЙЪ-ЪБ УЕФЕЧЩИ ПЫЙВПЛ. лБЦДЩК РБЛЕФ ДПМЦЕО ВЩФШ РПНЕЮЕО ЕЗП БДТЕУБФПН, Й ОЕФ ЗБТБОФЙЙ, ЮФП ПО ВХДЕФ ДПУФБЧМЕО. уЙУФЕНБ ЗБТБОФЙТХЕФ ФПМШЛП "НБЛУЙНБМШОЩЕ ХУЙМЙС", РПЬФПНХ РБЛЕФЩ НПЗХФ ЙУЮЕЪОХФШ ЙМЙ РТЙВЩФШ Ч ТБЪМЙЮОПН РПТСДЛЕ. уПЛЕФ УФЙМС ДБФБЗТБНЩ ЧЕДЕФ УЕВС УИПДОП У РПЮФПК. пФРТБЧЙФЕМШ ПРТЕДЕМСЕФ БДТЕУ РПМХЮБФЕМС ДМС ЛБЦДПЗП ЙОДЙЧЙДХБМШОПЗП УППВЭЕОЙС.

рТПУФТБОУФЧП ЙНЕО ПРТЕДЕМСЕФ, ЛБЛ ЪБРЙУБОЩ БДТЕУБ УПЛЕФБ ( socket addresses ). бДТЕУ УПЛЕФБ ЙДЕОФЙЖЙГЙТХЕФ ПДЙО ЛПОЕГ РПДЛМАЮЕОЙС УПЛЕФБ. оБРТЙНЕТ, БДТЕУБ УПЛЕФБ Ч МПЛБМШОПН РТПУФТБОУФЧЕ ЙНЕО СЧМСАФУС ПВЩЮОЩНЙ ЙНЕОБНЙ ЖБКМПЧ. ч РТПУФТБОУФЧЕ ЙНЕО йОФЕТОЕФ БДТЕУ УПЛЕФБ УПУФПЙФ ЙЪ йОФЕТОЕФ БДТЕУБ ( IP БДТЕУ) ЗМБЧОПЗП ЛПНРШАФЕТБ, РТЙУПЕДЙОЕООПЗП Л УЕФЙ Й ОПНЕТБ РПТФБ, ЛПФПТЩК ЙДЕОФЙЖЙГЙТХЕФ УПЛЕФ УТЕДЙ НОПЦЕУФЧБ УПЛЕФПЧ ОБ ФПН ЦЕ ЗМБЧОПН ЛПНРШАФЕТЕ.

рТПФПЛПМ ПРТЕДЕМСЕФ, ЛБЛ РЕТЕДБАФУС ДБООЩЕ. уХЭЕУФЧХАФ УМЕДХАЭЙЕ ЧЙДЩ РТПФПЛПМПЧ: TCP/IP , РЕТЧЙЮОЩЕ УЕФЕЧЩЕ РТПФПЛПМЩ, ЙУРПМШЪХЕНЩЕ йОФЕТОЕФПН; УЕФЕЧПК РТПФПЛПМ AppleTalk ; МПЛБМШОЩК UNIX РТПФПЛПМ ЧЪБЙНПДЕКУФЧЙС. оЕ ЧУЕ ЛПНВЙОБГЙЙ УФЙМЕК, РТПУФТБОУФЧ ЙНЕО Й РТПФПЛПМПЧ РПДДЕТЦЙЧБАФУС.

уЙУФЕНОЩЕ ЧЩЪПЧЩ

чЙДЩ УЙУФЕНОЩИ ЧЩЪПЧПЧ:

  • socket — УПЪДБФШ УПЛЕФ
  • closes — ХОЙЮФПЦЙФШ УПЛЕФ
  • connect — УПЪДБФШ УПЕДЙОЕОЙЕ НЕЦДХ ДЧХНС УПЛЕФБНЙ
  • bind — РТЙЧСЪБФШ УПЛЕФ Л РПТФХ УЕТЧЕТБ
  • listen — ОБУФТПКЛБ УПЛЕФБ ДМС РТЙОСФЙС РПДЛМАЮЕОЙК
  • accept — РТЙОСФШ ЪБРТПУ ОБ УПЕДЙОЕОЙЕ Й УПЪДБФШ УПЛЕФ ДМС РТПГЕУУБ ЧЪБЙНПДЕКУФЧЙС

уПЛЕФЩ РТЕДУФБЧМСАФУС ДЕУЛТЙРФПТБНЙ ЖБКМПЧ.

уПЪДБОЙЕ Й ХОЙЮФПЦЕОЙЕ УПЛЕФПЧ

у РПНПЭША ЖХОЛГЙК socket Й close УПЪДБАФУС Й ХОЙЮФПЦБАФУС УПЛЕФЩ. рТЙ УПЪДБОЙЙ УПЛЕФБ, ОЕПВИПДЙНП ПРТЕДЕМЙФШ ФТЙ РБТБНЕФТБ УПЛЕФБ: РТПУФТБОУФЧП ЙНЕО, УФЙМШ ЧЪБЙНПДЕКУФЧЙС Й РТПФПЛПМ.

дМС ХЛБЪБОЙС РТПУФТБОУФЧБ ЙНЕО ЙУРПМШЪХАФУС ЛПОУФБОФЩ, ОБЮЙОБАЭЙЕУС У PF_ (УПЛТБЭЕОЙЕ "УЕНЕКУФЧП РТПФПЛПМБ"). оБРТЙНЕТ, PF_LOCAL ЙМЙ PF_UNIX ПРТЕДЕМСАФ МПЛБМШОПЕ РТПУФТБОУФЧП ЙНЕО, Й PF_INET ПРТЕДЕМСЕФ йОФЕТОЕФ РТПУФТБОУФЧП ЙНЕО.

чФПТПК РБТБНЕФТ, УФЙМШ ЧЪБЙНПДЕКУФЧЙС, РТЕДУФБЧМСЕФ УПВПК ЛПОУФБОФХ, ОБЮЙОБАЭЙАУС У SOCK_ . SOCK_STREAM ПРЕТЕДЕМСЕФ УФЙМШ ЧЪБЙНПДЕКФУЧЙС УПЕДЙОЕОЙЕ, SOCK_DGRAM — УФЙМШ ДБФБЗТБНЩ.

фТЕФЙК РБТБНЕФТ, РТПФПЛПМ, ПРТЕДЕМСЕФ НЕИБОЙЪН ОЙЦОЕЗП ХТПЧОС ДМС РЕТЕДБЮЙ Й РПМХЮЕОЙС ДБООЩИ. дМС ЛБЦДПК ЛПНВЙОБГЙЙ РТПУФТБОУФЧП ЙНЕО — УФЙМШ ЧЪБЙНПДЕМКУФЧЙС УХЭЕУФЧХЕФ УЧПК РТПФПЛПМ.

дМС ЛБЦДПК РБТЩ УХЭЕУФЧХЕФ МХЮЫЙК РТПФПЛПМ, РПЬФПНХ НПЦОП ХЛБЪБФШ 0, ЮФП УППФЧЕФУЧХЕФ ЬФПНХ РТПФПЛПМХ. еУМЙ ЛПНБОДБ socket ЧЩРПМОЕОБ ХУРЕЫОП, Ч ЛБЮЕУФЧЕ ТЕЪХМШФБФБ ЧПЪЧТБЭБЕФУС ДЕУЛТЙРФПТ ЖБКМБ ДМС УПЛЕФБ. у РПНПЭША ЛПНБОД read Й write , НПЦОП ЮЙФБФШ Й ЪБРЙУЩЧБФШ ДБООЩЕ Ч УПЛЕФ.

чЩЪПЧ connect

дМС УПЪДБОЙС УПЕДЙОЕОЙЕ НЕЦДХ ДЧХНС УПЛЕФБНЙ, ЛМЙЕОФ ЧЩЪЩЧБЕФ connect , РЕТЕДБЧБС БДТЕУ УПЛЕФБ УЕТЧЕТБ ДМС РПДЛМАЮЕОЙС. лМЙЕОФ — РТПГЕУУ, ЙОЙГЙБМЙЪЙТХАЭЙК УПЕДЙОЕОЙЕ, Б УЕТЧЕТ — РТПГЕУУ, ПЦЙДБАЭЙК ТБЪТЕЫЕОЙС УПЕДЙОЕОЙС. лМЙЕОФ РПУЩМБЕФ ЪБРТПУ connect , ЮФПВЩ ЙОЙГЙБМЙЪЙТПЧБФШ УПЕДЙОЕОЙЕ НЕЦДХ МПЛБМШОЩН УПЛЕФПН Й УПЛЕФПН УЕТЧЕТБ, РЕТЕДБООЩН Ч ЛБЮЕУФЧЕ ЧФПТПЗП РБТБНЕФТБ. ч ЛБЮЕУФЧЕ ФТЕФШЕЗП РБТБНЕФТБ РЕТЕДБЕФУС ДМЙОБ, Ч ВБКФБИ, БДТЕУОПК УФТХЛФХТЩ, ОБ ЛПФПТХА ХЛБЪЩЧБЕФ ЧФПТПК РБТБНЕФТ.

пФРТБЧЛБ ДБООЩИ

мАВБС ФЕИОЙЛБ ЪБРЙУЙ Ч ДЕУЛТЙРФПТ ЖБКМБ, НПЦЕФ ЙУРПМШЪПЧБФШУС РТЙ ЪБРЙУЙ Ч УПЛЕФ. жХОЛГЙС send , ПРТЕДЕМЕООБС ДМС ДЕУЛТЙРФПТПЧ ЖБКМПЧ УПЛЕФБ, БОБМПЗЙЮОБ ЖХОЛГЙЙ write У ОЕУЛПМШЛЙНЙ ДПРПМОЙФЕМШОЩНЙ РБТБНЕФТБНЙ.

Читайте также:  Буквы в виде молнии

уЕТЧЕТЩ

гЙЛМ ЦЙЪОЙ УЕТЧЕТБ УПУФПЙФ ЙЪ УПЪДБОЙС УПЛЕФБ, РТЙЧСЪЛЙ УПЛЕФБ Л БДТЕУХ, ЧЩЪПЧБ listen , ТБЪТЕЫБАЭЕЗП УПЕДЙОЕОЙЕ У УПЛЕФПН, ЧЩЪПЧБ accept , РТЙОЙНБАЭЕЗП ЧИПДСЭЙЕ УПЕДЙОЕОЙС, Й ЪБФЕН ЪБЛТЩФЙС УПЛЕФБ. дБООЩЕ ОЕ ЮЙФБАФУС Й ОЕ ЪБРЙУЩЧБАФУС ОЕРПУТЕДУФЧЕООП ЮЕТЕЪ УПЛЕФ УЕТЧЕТБ; ЧНЕУФП ЬФПЗП, ЛБЦДЩК ТБЪ ЛПЗДБ РТПЗТБННБ РТЙОЙНБЕФ ОПЧПЕ УПЕДЙОЕОЙЕ, Linux УПЪДБЕФ ПФДЕМШОЩК УПЛЕФ, ЙУРПМШЪХЕФУС РТЙ РЕТЕДБЮЕ ДБООЩИ РП ЬФПНХ УПЕДЙОЕОЙА. ч ЬФПН ТБЪДЕМЕ ТБУУНБФТЙЧБАФУС ЧЩЪПЧЩ bind, listen Й accept .

у РПНПЭША ЛПНБОДЩ bind БДТЕУ УЕТЧЕТБ ДПМЦЕО ВЩФШ РТЙЧСЪБО Л УПЛЕФХ. рЕТЧЩК РБТБНЕФТ ЛПНБОДЩ — ДЕУЛТЙРФПТ ЖБКМБ УПЛЕФБ. чФПТПК РБТБНЕФТ — ХЛБЪБФЕМШ ОБ УФТХЛФХТХ БДТЕУБ УЕТЧЕТБ; ЖПТНБФ ЛПФПТПЗП ЪБЧЙУЙФ ПФ УЕНЕКУФЧБ БДТЕУБ. фТЕФЙК РБТБНЕФТ — ДМЙОБ УФТХЛФХТЩ БДТЕУБ, Ч ВБКФБИ.

лПЗДБ БДТЕУ УЧСЪБО У УПЛЕФПН УФЙМС УПЕДЙОЕОЙЕ, ОЕПВИПДЙНП ЧЩЪЧБФШ listen , ЮФПВЩ ХЛБЪБФШ, ЮФП ЬФП — УЕТЧЕТ. рЕТЧЩК РБТБНЕФТ ЛПНБОДЩ — ДЕУЛТЙРФПТ ЖБКМБ УПЛЕФБ. чФПТПК РБТБНЕФТ ПРТЕДЕМСЕФ, ДМЙОХ ПЮЕТЕДЙ ПЦЙДБАЭЙИ УПЕДЙОЕОЙК. еУМЙ ПЮЕТЕДШ ЪБРПМОЕОБ, ДПРПМОЙФЕМШОЩЕ УПЕДЙОЕОЙС ВХДХФ ПФЧЕТЗОХФЩ. ьФП ОЕ ПЗТБОЙЮЙЧБЕФ ПВЭЕЕ ЛПМЙЮЕУФЧП УПЕДЙОЕОЙК, ЛПФПТЩЕ УЕТЧЕТ НПЦЕФ ПВТБВПФБФШ; ЬФП ПЗТБОЙЮЙЧБЕФ ФПМШЛП ЮЙУМП ЛМЙЕОФПЧ, РЩФБАЭЙИУС УПЕДЙОЙФШУС Й ОЕ РПМХЮЙЧЫЙИ РПДФЧЕТЦДЕОЙЕ.

у РПНПЭША ЛПНБОДЩ accept УЕТЧЕТ РТЙОЙНБЕФ ЪБРТПУ ОБ УПЕДЙОЕОЙЕ ПФ ЛМЙЕОФБ. рЕТЧЩК РБТБНЕФТ ЧЩЪПЧБ — ДЕУЛТЙРФПТ ЖБКМБ УПЛЕФБ. чФПТПК РБТБНЕФТ ХЛБЪЩЧБЕФ ОБ УФТХЛФХТХ БДТЕУБ УПЛЕФБ, Ч ЛПФПТПК ИТБОЙФУС БДТЕУ ЛМЙЕОФУЛПЗП УПЛЕФБ. фТЕФЙК РБТБНЕФТ — ДМЙОБ, Ч ВБКФБИ, УФТХЛФХТЩ БДТЕУБ УПЛЕФБ. уЕТЧЕТ НПЦЕФ ЙУРПМШЪПЧБФШ БДТЕУ ЛМЙЕОФБ, ЮФПВЩ ПРТЕДЕМЙФШ, ФТЕВХЕФУС МЙ ДЕКУФЧЙФЕМШОП ЧЪБЙНПДЕКУФЧПЧБФШ У ЛМЙЕОФПН.

чЩЪПЧ accept УПЪДБЕФ ОПЧЩК УПЛЕФ ДМС ЧЪБЙНПДЕКУФЧЙС У ЛМЙЕОФПН Й ЧПЪЧТБЭБЕФ УППФЧЕФУФЧХАЭЙК ДЕУЛТЙРФПТ ЖБКМБ. пТЙЗЙОБМШОЩК УПЛЕФ УЕТЧЕТБ РТПДПМЦБЕФ РТЙОЙНБФШ ОПЧЩЕ ЛМЙЕОФУЛЙЕ УПЕДЙОЕОЙС.

дМС ЮФЕОЙС ДБООЩИ ЙЪ УПЛЕФБ, ВЕЪ ХДБМЕОЙС ЙИ ЙЪ ЧИПДОПК ПЮЕТЕДЙ, ЙУРПМШЪХЕФУС ЛПНБОДБ recv . ч ЛБЮЕУФЧЕ РБТБНЕФТПЧ РЕТЕДБАФУС ФЕЦЕ БТЗХНЕОФЩ, ЮФП Й Ч ЛПНБОДЕ read , РМАУ ДПРПМОЙФЕМШОЩК РБТБНЕФТ FLAGS . жМБЗ MSG_PEEK ХЛБЪЩЧБЕФ, ЮФП ДБООЩЕ ДПМЦОЩ ВЩФШ РТПЮЙФБОЩ, ОП ОЕ ХДБМЕОЩ ЙЪ ЧИПДОПК ПЮЕТЕДЙ.

мПЛБМШОЩЕ УПЛЕФЩ

уПЛЕФЩ, РПДЛМАЮБАЭЙЕ РТПГЕУУЩ ОБ ПДОПН ЛПНРШАФЕТЕ НПЗХФ ЙУРПМШЪПЧБФШ МПЛБМШОПЕ РТПУФТБОУФЧП ЙНЕО, РТЕДУФБЧМСАЭЙК УПВПК УЙОПОЙН ДМС PF_LOCAL Й PF_UNIX . пОЙ ОБЪЩЧБАФУС МПЛБМШОЩНЙ УПЛЕФБНЙ ЙМЙ УПЛЕФБНЙ UNIX-ДПНЕОБ. бДТЕУБ ЬФЙИ УПЛЕФПЧ, ПРТЕДЕМСЕНЩЕ ЙНЕОБНЙ ЖБКМПЧ, ЙУРПМШЪХАФУС ФПМШЛП РТЙ УПЪДБОЙЙ УПЕДЙОЕОЙС.

йНС УПЛЕФБ ХЛБЪЩЧБЕФУС Ч УФТХЛФХТЕ sockaddr_un . еУМЙ Ч AF_LOCAL ХУФБОПЧМЕОП РПМЕ sun_family , ЬФП ХЛБЪЩЧБЕФ ОБ ФП, ЮФП БДТУ Ч ДПЛБМШОПН РТПУФТБОУФЧЕ ЙНЕО. рПМЕ Sun_path ХЛБЪЩЧБЕФ, ЮФП ЙУРПМШЪХЕФУС ЙНС ЖБКМБ; НБЛУЙНБМШОБС ДМЙОБ РПМС — 108 ВБКФ. дМС ЧЩЮЙУМЕОЙС ДМЙОЩ struct sockaddr_un ЙУРПМШЪХЕФУС НБЛТПЛПНБОДБ SUN_LEN . нПЦЕФ ЙУРПМШЪПЧБФШУС МАВПЕ ЙНС ЖБКМБ, ОП ДМС РТПГЕУУБ ДПМЦОП ВЩФШ ХУФБОПЧМЕОП РТБЧП ОБ ЪБРЙУШ Ч ЛБФБМПЗ. юФПВ УПЕДЙОЕОЙФШУС У УПЛЕФПН, РТПГЕУУБ ДПМЦЕО ЙНЕФШ РТБЧП ОБ ЮФЕОЙС ЖБКМБ. иПФС ТБЪМЙЮОЩЕ ЛПНРШАФЕТЩ НПЗХФ УПЧНЕУФОП ЙУРПМШЪПЧБФШ ПДОХ ЖБКМПЧХА УЙУФЕНХ, ФПМШЛП РТПГЕУУЩ, ЪБРХЭЕООЩЕ ОБ ЬФПН ЛПНРШАФЕТЕ, НПЗХФ ЧЪБЙНПДЕКУФЧПЧБФШ ЙУРПМШЪХС УПЛЕФЩ МПЛБМШОПЗП РТПУФТБОУФЧБ ЙНЕО.

еДЙОУФЧЕООЩК ДПРХУФЙНЩК РТПФПЛПМ ДМС МПЛБМШОПЗП РТПУФТБОУФЧБ ЙНЕО — 0. рПУЛПМШЛХ ПО ОБИПДЙФУС Ч ЖБКМПЧПК УЙУФЕНЕ, МПЛБМШОЩК УПЛЕФ РТЕДУФБЧМЕО ЛБЛ ЖБКМ.

оБРТЙНЕТ, ПВТБФЙФЕ ЧОЙНБОЙЕ ОБ ОБЮБМШОХА s:

чЩЪПЧ unlink ХДБМСЕФ МПЛБМШОЩК УПЛЕФ, РТЙ ЪБЧЕТЫЕОЙЙ ТБВПФЩ У ОЙН.

рТЙНЕТ ЙУРПМШЪПЧБОЙС МПЛБМШОЩИ УПЛЕФПЧ

ч МЙУФЙОЗЕ 5.10 РТЕДУФБЧМЕОБ РТПЗТБННБ УЕТЧЕТБ, Ч ЛПФПТПК УПЪДБЕФУС МПЛБМШОЩК УПЛЕФ Й УМХЫБЕФ ЪБРТПУЩ ОБ УПЕДЙОЕОЙС У УЕТЧЕТПН. рТЙ РПМХЮЕОЙЙ ЪБРТПУБ ОБ УПЕДЙОЕОЙЕ, УЕТЧЕТ ЮЙФБЕФ ФЕЛУФПЧЩЕ УППВЭЕОЙС, РЕТЕДБЧБЕНЩЕ ЮЕТЕЪ УПЕДЙОЕОЙЕ Й РЕЮБФБЕФ ЙИ. еУМЙ ПДОП ЙЪ ЬФЙИ УППВЭЕОЙК — "ЧЩИПД", РТПЗТБННБ УЕТЧЕТБ ХДБМСЕФ УПЛЕФ Й ЪБЧЕТЫБЕФУС. рТПЗТБННБ socket-server РТЕДРПМБЗБЕФ, ЮФП РХФШ Л УПЛЕФХ РЕТЕДБЕФУС ЮЕТЕЪ РБТБНЕФТ ЛПНБОДОПК УФТПЛЙ.

лМЙЕОФ-РТПЗТБННБ, РТЕДУФБЧМЕООБС Ч МЙУФЙОЗЕ 5.11, УПЕДЙОСЕФУС У МПЛБМШОЩН УПЛЕФПН Й РПУЩМБЕФ УППВЭЕОЙС. рХФШ Л УПЛЕФХ Й УППВЭЕОЙС РЕТЕДБtФУС ЮЕТЕЪ ЛПНБОДОХА УФТПЛХ.

рЕТЕД РЕТЕДБЮЕК УППВЭЕОЙС, РПУЩМБЕФУС ТБЪНЕТ УППВЭЕОЙС Ч ВБКФБИ Ч ЛБЮЕУФЧЕ РЕТЕНЕООПК length. уЕТЧЕТ УПИТБОСЕФ ТБЪНЕТ УППВЭЕОЙС, ДМС ЧЩДЕМЕОЙС РБНСФЙ РПД УППВЭЕОЙЕ. юФПВЩ ЧЩРПМОЙФШ ЬФПФ РТЙНЕТ, ОЕПВИПДЙНП ЪБРХУФЙФШ УЕТЧЕТ-РТПЗТБННХ Ч ПДОПН ПЛОЕ, ПРТЕДЕМЙФШ РХФШ Л УПЛЕФХ.

ч ДТХЗПН ПЛОЕ ЪБРХУФЙФШ ЛМЙЕОФ-РТПЗТБННХ ОЕУЛПМШЛП ТБЪ, ПРЕТЕДЕМСС ПДЙО Й ФПФ ЦЕ РХФШ УПЛЕФБ Й РПУЩМБС ЛМЙЕОФХ УППВЭЕОЙЕ:

уЕТЧЕТ-РТПЗТБННБ РПМХЮБЕФ Й РЕЮБФБЕФ ЬФЙ УППВЭЕОЙС. дМС ЪБЛТЩФЙС УПЕДЙОЕОЙС, ЛМЙЕОФ РПУЩМБЕФ УППВЭЕОЙЕ "quit":

Internet-Domain УПЛЕФЩ

CПЛЕФЩ UNIX-domain ЙУРПМШЪПЧБФШУС ФПМШЛП ДМС ЧЪБЙНПДЕКУФЧЙС ДЧХИ РТПГЕУУПЧ ФПМШЛП ОБ ПДОПН ЛПНРШАФЕТЕ. уПЛЕФЩ Internet, ЙУРПМШЪХАФУС ДМС УПЕДЙОЕОЙС ОЕУЛПМШЛЙИ РТПГЕУУПЧ ОБ ТБЪМЙЮОЩИ НБЫЙОБИ, РПДЛМАЮЕООЩИ Л УЕФЙ.

дМС УПЕДЙОЕОЙС РТПГЕУУПЧ ЮЕТЕЪ йОФЕТОЕФ УПЛЕФЩ ЙУРПМШЪХАФ РТПУФТБОУФЧП ЙНЕО йОФЕТОЕФ ХЛБЪЩЧБЕНПЕ У РПНПЭША PF_INET . вПМШЫЙОУФЧП РТПФПЛПМПЧ СЧМСАФУС TCP/IP . йОФЕТОЕФ РТПФПЛПМ ( IP ), РТПФПЛПМ ОЙЦОЕЗП ХТПЧОС, ПФРТБЧМСЕФ РБЛЕФЩ ЮЕТЕЪ йОФЕТОЕФ, ТБЪВЙЧБС ОБ НЕОШЫЙЕ РБЛЕФЩ, Ч УМХЮБЕ ОЕПВИПДЙНПУФЙ. пО ЗБТБОФЙТХЕФ ФПМШЛП ДПУФБЧЛХ "МХЮЫЕЗП ХУЙМЙС", ФБЛ ЮФП РБЛЕФЩ НПЗХФ ВЩФШ РПФЕТСОЩ ЙМЙ РЕТЕХРПТСДПЮЕОЩ ЧП ЧТЕНС ФТБОУРПТФЙТПЧЛЙ. лБЦДЩК ЛПНРШАФЕТ ЙНЕЕФ IP БДТЕУ. рТПФПЛПМ ХРТБЧМЕОЙС РЕТЕДБЮЕК ( TCP ), ЛПФПТЩК УМЕДХЕФ ЪБ IP РТПФПЛПМПН, ПВЕУРЕЮЙЧБЕФ ОБДЕЦОПЕ РПДЛМАЮЕОЙЕ. ьФП РПЪЧПМСЕФ ХУФБОПЧЙФШ НЕЦДХ ЛПНРШАФЕТБНЙ УПЕДЙОЕОЙЕ, ОБРПДПВЙЕ ФЕМЕЖПООПЗП Й ЗБТБОФЙТХЕФ ДПУФБЧЛХ ДБООЩИ Ч РБТЧЙМШОПН РПТСДЛЕ.

йОФЕТОЕФ БДТЕУ УПЛЕФБ УПУФПЙФ ЙЪ ДЧХИ ЮБУФЕК: ОПНЕТБ ЛПНРШАФЕТБ Й ОПНЕТБ РПТФБ. ьФБ ЙОЖПТНБГЙС ИТБОЙФУС Ч РЕТЕНЕООПК УФТХЛФХТЩ sockaddr_in . дМС ЙДЕОФЙЖЙЛБГЙЙ ФПЗП, ЮФП ЬФП БДТЕУ йОФЕТОЕФ РТПУФТБОУФЧБ ЙНЕО, ОЕПВИПДЙНП ХУФБОПЧЙФШ РПМЕ sin_family Ч AF_INET . ч РПМЕ Sin_addr ИТБОЙФУС йОФЕТОЕФ БДТЕУ ЛПНРШАФЕТБ, ЛБЛ 32-ТБЪТСДОПЕ ГЕМПЕ ЮЙУМП IP . лБЦДПНХ УПЛЕФХ ОБ ПДОПН ЛПНРШАФЕТЕ РТЙУЧБЙЧБЕФУС ОПНЕТ РПТФБ. рПУЛПМШЛХ ТБЪМЙЮОЩЕ НБЫЙОЩ УПИТБОСАФ НОПЗПВБКФПЧЩЕ ЪОБЮЕОЙС Ч ТБЪМЙЮОПН РПТСДЛЕ ВБКФБ, ЙУРПМШЪХАФ htons , ЮФПВЩ РТЕПВТБЪПЧБФШ ЮЙУМП РПТФБ Л УЕФЕЧПНХ РПТСДЛХ ВБКФПЧ.

лПНБОДБ gethostbyname РТЕПВТБЪПЧЩЧБЕФ ХДПВПЮЙФБЕНЩЕ ЙНЕОБ ИПУФБ, ЮЙУМБ УП УФБОДБТФОПК ФПЮЕЮОПК ОПФБГЙЕК (ФЙРБ 10.0.0.1) ЙМЙ DNS ЙНЕОБ (ФБЛЙЕ ЛБЛ www.codesourcery.com) Ч 32-ТБЪТСДОЩЕ IP БДТЕУБ. ч ЛБЮЕУФЧЕ ТЕЪХМШФБФБ ЧПЪЧТБЭБЕФУС ХЛБЪБФЕМШ ОБ УФТХЛФХТХ struct hostent ; Ч РПМЕ h_addr ИТБОЙФУС IP БДТЕУ ЗМБЧОПЗП ЛПНРШАФЕТБ.

мЙУФЙОЗ 5.12 ЙММАУФТЙТХЕФ ЙУРПМШЪПЧБОЙЕ Internet-domain УПЛЕФПЧ. рТПЗТБННБ РПМХЮБЕФ ДПНБЫОАА УФТБОЙГХ ПФ Web УЕТЧЕТБ, ЙНС ИПУФБ ЛПФПТПЗП ПРТЕДЕМЕОП Ч ЛПНБОДОПК УФТПЛЕ.

йНС ИПУФБ Web УЕТЧЕТБ ЪБДБЕФУС Ч ЛПНБОДОП УФТПЛЕ (ВЕЪ "http: //"). лПНБОДБ gethostbyname РТЕПВТБЪПЧЩЧБЕФ ЙНС ИПУФБ Ч ЮЙУМПЧПК IP БДТЕУ Й ЪБФЕН РПДЛМАЮБЕФ РПФПЛ (TCP) УПЛЕФБ Л РПТФХ 80 ОБ ЗМБЧОПН ЛПНРШАФЕТЕ. уЕТЧЕТЩ ЙУРПМШЪХАФ зЙРЕТФЕЛУФПЧЩК фТБОУРПТФОЩК рТПФПЛПМ ( HTTP ), РПЬФПНХ РЕТЕДБЕФУС ЛПНБОДБ HTTP GET , УЕТЧЕТ Ч ЛБЮЕУФЧЕ ПФЧЕФБ РЕТЕДБЕФ ФЕЛУФ ДПНБЫОЕК УФТБОЙГЩ.

дМС ПФПВТБЦЕОЙС УФТБОЙГЩ www.codesourcery.com, ОЕПВИПДЙНП ЪБДБФШ УМЕДХАЭХЕ ЛПНБОДХ

рБТЩ УПЛЕФПЧ

лБЛ ХРПНЙОБМПУШ ТБОЕЕ, ЖХОЛГЙС pipe , УПЪДБЕФ ДЧБ ДЕУЛТЙРФПТБ ЖБКМПЧ ДМС ОБЮБМБ Й ЛПОГБ ЛБОБМБ. лБОБМЩ ПЗТБОЙЮЕОЩ, РПФПНХ ЮФП ДЕУЛТЙРФПТЩ ЖБКМПЧ ЙУРПМШЪХАФУС ФПМШЛП УЧСЪБООЩНЙ РТПГЕУУБНЙ Й РПФПНХ ЮФП ЧЪБЙНПДЕКУФЧЙЕ ПДОПОБРТБЧМЕОП. жХОЛГЙС socketpair УПЪДБЕФ ДЧБ ДЕУЛТЙРФПТБ ЖБКМПЧ ДМС ДЧХИ УПЛЕФПЧ, РПДЛМАЮЕООЩИ ОБ ПДОПН ЛПНРШАФЕТЕ. ьФЙ ДЕУЛТЙРФПТЩ ЖБКМПЧ ТБЪТЕЫБАФ ДЧХИУФПТПООЕЕ ЧЪБЙНПДЕКУФЧЙЕ ДЧХИ УЧСЪБООЩИ РТПГЕУУПЧ. рЕТЧЩЕ ФТЙ РБТБНЕФТБ ЛПНБОДЩ — ЙДЕОФЙЮОЩ РБТБНЕФТБН ЛПНБОДЩ socket : ПОЙ ПРТЕДЕМСАФ ДПНЕО, УФЙМШ РПДЛМАЮЕОЙС Й РТПФПЛПМ. рПУМЕДОЙК РБТБНЕФТ — НБУУЙЧ У ДЧХНС ГЕМЩНЙ ЮЙУМБНЙ, Ч ЛПФПТПН ИТБОСФУС ИБТБЛФЕТЙУФЙЛЙ ЖБКМПЧ ЬФЙИ ДЧХИ УПЛЕФПЧ. рТЙ ЙУРПМШЪПЧБОЙЙ ЛПНБОДЩ socketpair , ОЕПВИПДЙНП ПРТЕДЕМЙФШ PF_LOCAL ЛБЛ РТПУФТБОУФЧП ЙНЕО.

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.

Читайте также:  Прошивка асус зенфон 2 ze550kl

Иногда возникает необходимость использовать протоколы низкого уровня, которые позволяют обмениваться большим количеством сообщений с помощью стека 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 сокеты лучше всего использовать там, где нужна эффективность на быстрых сетях с короткими соединениями и данные реального времени, а гарантированность доставки сообщений не нужна.