1 (изменено: ypppu, 2017-12-21 19:04:59)

Тема: AHK: Проблемы с обработкой данных - AHKsock (WinSock)

Предисловие:

Уже которую тему пишу по поводу проблем с сокетами. Мучаюсь с этим делом примерно полгода. Скрипт раньше работал на костылях, да и сейчас так же. Решил улучшить работоспособность.

Привет, форум.
Есть сервер, есть клиент. Передача, получение, взаимодействие и.т.п.
Использую AHKsock - библиотека которая работает с WinSock.


Каждый пакет перед отправкой на сервер\клиент обрабатывается. А конкретнее:
Первые 8 байт = № пакета
Вторые 8 байт = длина отправляемого сообщения
Все остальные байты - само сообщение.
Примерно оно выглядит так: (весь пакет отправляется в бинарном коде)


01010101 10000001 1000000000000000000

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

Есть но - "остальная часть" приходит без информации о пакете и длине. То есть, просто кусок байтов, вырванный из непонятно какого пакета. И предстоит вопрос, а как понять из какого пакета он оторвался?

Я в сокетах сильно не "шарю" и поэтому еще парочку вопросов:
Когда отправляю пакет и он разделятся на фреймы. Допустим два фрейма, то может ли второй пакет влезть между фреймами первого пакета? Если да, то вопрос выделенный выше. Если нет, то думаю надо обрабатывать "остальную часть" как кусок последнего отправленного пакета, так?

P.S. "рылся" на просторах cyberforum - ничего подобного не нашел.

2

Re: AHK: Проблемы с обработкой данных - AHKsock (WinSock)

MandarinKa02 пишет:

К примеру, данные в которых содержится информация о пакете(№пакета и длина) и часть сообщения могут отправиться а остальная часть прилетит отдельно. Или смешается с другим пакетом.

MandarinKa02 пишет:

Допустим два фрейма, то может ли второй пакет влезть между фреймами первого пакета?

Что-то не пойму, пакеты у вас по факту смешиваются? Или вы гипотетически рассуждаете? В чём проблема-то у вас?

3 (изменено: belyankin12, 2017-08-07 10:06:37)

Re: AHK: Проблемы с обработкой данных - AHKsock (WinSock)

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

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

4

Re: AHK: Проблемы с обработкой данных - AHKsock (WinSock)

belyankin12
Это я понимаю, мой вопрос был про перемешивание частей разных пакетов. Оно происходит в реальности?

5 (изменено: belyankin12, 2017-08-07 10:36:55)

Re: AHK: Проблемы с обработкой данных - AHKsock (WinSock)

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

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

6

Re: AHK: Проблемы с обработкой данных - AHKsock (WinSock)

belyankin12 пишет:

Автор не уверен, будут ли куски байтов, оторвавшиеся от своего пакета, смешиваться со следующими пакетами. Если да - то придется использовать функцию, которая у него есть, для отделения байтов и т.д.

А как эта функция будет определять, от какого пакета какой кусок, если они безымянные и перемешаны? Это что, искусственный интеллект с экстрасенсорными способностями?

7

Re: AHK: Проблемы с обработкой данных - AHKsock (WinSock)

YMP, без понятия. Но нашему автору не страшен случай, когда оторвавшийся кусок пакетов приклеится к следующему.

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

8 (изменено: ypppu, 2017-12-21 19:03:19)

Re: AHK: Проблемы с обработкой данных - AHKsock (WinSock)

belyankin12 Всё за меня обьяснил.)

belyankin12 пишет:

Но нашему автору не страшен случай, когда оторвавшийся кусок пакетов приклеится к следующему.

Не страшен, если всё будет по очередности отправляться. Я сохраню значение последнего отправленного пакета и потом "пустые" байты припишу к этому пакету.

belyankin12 пишет:

Автор не уверен, будут ли куски байтов, оторвавшиеся от своего пакета, смешиваться со следующими пакетами.

Я пока что не проверял это, но а если? Отправляется половина первого, потом второй полностью\частью и сверху еще вторая половина первого, или ещё хуже... Третий влезет. (-_-)

P.S. Буду проверять на деле. Отпишусь позже, что и как.

9

Re: AHK: Проблемы с обработкой данных - AHKsock (WinSock)

YMP

Это что, искусственный интеллект с экстрасенсорными способностями?

Мне бы такое точно не помешало. Есть на складе?

10

Re: AHK: Проблемы с обработкой данных - AHKsock (WinSock)

MandarinKa02
Нету даже в проекте. А перемешиваться данные не должны. С чего бы вдруг и кто бы тогда стал этими сокетами пользоваться?

11 (изменено: MandarinKa02, 2017-08-07 14:22:28)

Re: AHK: Проблемы с обработкой данных - AHKsock (WinSock)

YMP
Я тоже так думаю. Если бы разбивались и при этом перемешивались, то чтобы из этого вышло. Вычитал информацию про сокеты: "пакеты передаются потоком". То есть никаких пробелов между фреймами быть не должно. Значит и второй, и третий пакет не влезит в середину первого. Практика покажет.

12

Re: AHK: Проблемы с обработкой данных - AHKsock (WinSock)

По-моему тут актуальна проблема не перемешивания пакетов, а их потери. Вот пришёл пакет, потом ещё один. Откуда приёмник знает, что это пакеты №1 и  №2? Может это №7 и №10, а остальные по пути потерялись.

13

Re: AHK: Проблемы с обработкой данных - AHKsock (WinSock)

ypppu, UDP vs TCP?

14

Re: AHK: Проблемы с обработкой данных - AHKsock (WinSock)

В смысле AHKsock (WinSock) не боится потерь? Я-то не очень в протоколах разбираюсь.
Error Checking
TCP does error checking and error recovery. Erroneous packets are retransmitted from the source to the destination.
UDP does error checking but simply discards erroneous packets. Error recovery is not attempted.

15

Re: AHK: Проблемы с обработкой данных - AHKsock (WinSock)

ypppu, каждый пакет имеет свой определенный номер. Я думаю по этим номерам можно отслеживать, есть ли потери.

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

16 (изменено: ypppu, 2017-12-21 19:01:55)

Re: AHK: Проблемы с обработкой данных - AHKsock (WinSock)

ypppu пишет:

По-моему тут актуальна проблема не перемешивания пакетов, а их потери. Вот пришёл пакет, потом ещё один. Откуда приёмник знает, что это пакеты №1 и  №2? Может это №7 и №10, а остальные по пути потерялись.

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

17 (изменено: MandarinKa02, 2017-12-21 19:45:55)

Re: AHK: Проблемы с обработкой данных - AHKsock (WinSock)

Спасибо всем кто ответил в этой теме. За время теста своего скрипта(2-3 дня), выяснил несколько вещей. Данные отправляется поочередно(т.е. второй или третий или.. не могут влезть между первым), всё доходит с точностью до 100%(если конечно во время отправки не оборвать соединение).

P.S. ответил на свои вопросы сам.

18

Re: AHK: Проблемы с обработкой данных - AHKsock (WinSock)

MandarinKa02 пишет:

P.S. ответил на свои вопросы сам)

Ну так практика — критерий истины, а не форум. Мало ли что понапишут на форуме.