Как стать автором
Обновить

SyncStream — библиотека C# для передачи данных по нестабильным каналам

Время на прочтение3 мин
Количество просмотров2.3K
Недавно нашел старую самопальную библиотеку, реализовавшую простой протокол передачи данных в пакетах по TCP.
После обработки напильником и долотом получилось очень даже ничего (:

Встречайте — библиотека SyncStream для передачи данных по глючащим каналам:
  • Восстанавливает синхронизацию между сервером и клиентом, если часть данных «провалилась» по пути
  • Проверяет целостность всех доставляемых пакетов
  • Имеет механизм гарантированной доставки для особо важных пакетов
  • Не завязан на низлежащий протокол передачи — можно прикрутить даже к лазерному каналу



UPD: видимо, не очевидно, что канал — это не только витая пара и TCP/IP. Библиотека работает вообще с любым транспортом — будь то радиоканал или ИК-порт — достаточно написать и подцепить свой интерфейсный класс.
UPD 2: Для особо настойчивых: библиотека НЕ привязана к TCP/IP

О принципе работы

Для реализации мультипротокольности при создании сокета вы передаете класс, производный от абстрактного класса BaseImplementation, который должен содержать характерные для сокетов методы Connect(), Close(), Bind(), Listen(), Send(), Receive(). После этого, все действия, связанные непосредственно с отправкой данных будут производиться через этот класс.
В библиотеку уже включен соответствующий класс для работы через TCP.

Данные отправляются в виде пакетов.
Пакет содержит:

  • «Волшебную последовательность» (magic) начала пакета
  • Длину пакета
  • Контрольную сумму
  • Тип пакета
  • Имя команды
  • Список аргументов:
    • Имя аргумента
    • Значение (string/int/byte[])
  • «Волшебную последовательность» (magic) окончания пакета


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

О приятном и веселом использовании

Пример кода клиента:

Copy Source | Copy HTML
  1. class MainClass
  2.     {
  3.         public static void Main(string[] args)
  4.         {
  5.             Socket s = new Socket(new TcpImplementation());
  6.             s.Receive += new Socket.ReceiveEvent(OnReceive);
  7.             s.Connect("127.0.0.1:1111");
  8.             while (true) {
  9.                 string ss = Console.ReadLine();
  10.                 Packet p = new Packet("message", new Argument("text", ss));
  11.                 p.Important = true;
  12.                 s.Send(p);
  13.             }
  14.         }
  15.  
  16.         public static void OnReceive(Socket s, Packet p) {
  17.             Console.WriteLine("<< " + p["text"]);
  18.         }
  19.     }


Скачать библиотеку, исходники, а также найти несколько более сложные примеры клиента и сервера можно здесь:
Репозиторий на GitHub
Прямая ссылка на ZIP
Теги:
Хабы:
+22
Комментарии38

Публикации

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн