У
Удалённый пользователь 144706
Гость
Автор темы
Предисловие:
Это продолжение моего предыдущего поста Исходник - Гайд - Сетевое взаимодействие скриптов посредством SAMP пакетов(https://blast.hk/threads/18680/) про взаимодействие скриптов через SAMP-пакеты. Там я расписал в подробностях, как отправить 25 байт другому игроку. Я решил использовать эту фишку и написать скрипт, который передаёт файлы. У меня было очень много проблем с передачей. Передача была похожа больше на протокол UDP (т.е. данные могли передаться, а могли потеряться). Мне сразу захотелось сделать передачу данных с гарантией получения. Так я разработал библиотеку для передачи любого размера (не больше 128 килобайт).
Начинаем работать с библиотекой:
Для использования вам понадобится реализовать CALLBACK функцию receive_data, которая принимает 3 параметра:
Для отправки данных используется функция send_data с параметрами:
Ещё стоит добавить, что переменные 21@ - 27@ будут заняты библиотекой и использовать их не рекомендуется.
Небольшой пример отправки и приёма данных размером 10 КБ:
Да, и небольшое предупреждение: не используйте функцию send_data в CALLBACK функциях, типа таймеров, хуков и т.д. Используйте её только в потоках. И да, receive_data тоже вызывается из хука @incoming_packet_hook. Так что если нужно запустить цикл или поставить задержку, то создавайте новый поток.
Передавать можно любые данные, любой длины (ограничение 128 КБ за раз). Доставка данных гарантирована (разве что игрок пропадёт из зоны стрима). Работать должна на любом SAMP сервере. Можете настраивать библиотеку под себя, внутри исходника есть некоторые параметры, вроде задержки между отправкой пакетов, ограничением на размер передаваемых данных, сигнатурами заголовка, данных, конца, ответов да/нет и т.д. Весь код тщательно закомментирован.
Если будут какие-то проблемы с библиотекой - пишите в комментариях.
Теперь не по теме:
В данный момент я работаю над созданием голосового чата для SAMP. (Пишу на C++)
Уже удалось передать моно звук на частоте 8 КГц практически не нагружая сервер. Битрейт передачи звука примерно 6 Кбит/с.
Поддержать автора:
Это продолжение моего предыдущего поста Исходник - Гайд - Сетевое взаимодействие скриптов посредством SAMP пакетов(https://blast.hk/threads/18680/) про взаимодействие скриптов через SAMP-пакеты. Там я расписал в подробностях, как отправить 25 байт другому игроку. Я решил использовать эту фишку и написать скрипт, который передаёт файлы. У меня было очень много проблем с передачей. Передача была похожа больше на протокол UDP (т.е. данные могли передаться, а могли потеряться). Мне сразу захотелось сделать передачу данных с гарантией получения. Так я разработал библиотеку для передачи любого размера (не больше 128 килобайт).
Начинаем работать с библиотекой:
Для использования вам понадобится реализовать CALLBACK функцию receive_data, которая принимает 3 параметра:
- 0@ - ID игрока отправившего пакет
- 1@ - указатель на данные
- 2@ - длина данных в байтах
CLEO:
free 1@
Для отправки данных используется функция send_data с параметрами:
- ID игрока, кому нужно отправить пакет
- указатель на данные
- длина данных в байтах
Ещё стоит добавить, что переменные 21@ - 27@ будут заняты библиотекой и использовать их не рекомендуется.
Небольшой пример отправки и приёма данных размером 10 КБ:
CLEO:
{$CLEO .cs}
{$INCLUDE NetLib.txt}
0000: NOP
alloc 0@ 10240
1@ = FALSE
0B34: samp register_client_command "send" to_label @send_message
while true
wait 0
if 1@ == TRUE
then
1@ = FALSE
0B35: samp 1@ = get_last_command_params
0AD4: 3@ = scan_string 1@ format "%d" 2@
call @send_data 3 2@ 0@ 10240 3@ // bool send_data(WORD player_id, void *data, DWORD length)
if 3@ == TRUE
then
chatmsg "Передача данных прошла успешно!" -1
else
chatmsg "Передача данных не удалась!" -1
end
end
end
:send_message
1@ = TRUE
cmdret
// void CALLBACK receive_data(WORD player_id, void *data, DWORD length)
:receive_data
chatmsg "Пришло сообщение от игрока ID(%d) длинной %d байт." -1 0@ 2@
free 1@
ret 0
Да, и небольшое предупреждение: не используйте функцию send_data в CALLBACK функциях, типа таймеров, хуков и т.д. Используйте её только в потоках. И да, receive_data тоже вызывается из хука @incoming_packet_hook. Так что если нужно запустить цикл или поставить задержку, то создавайте новый поток.
Передавать можно любые данные, любой длины (ограничение 128 КБ за раз). Доставка данных гарантирована (разве что игрок пропадёт из зоны стрима). Работать должна на любом SAMP сервере. Можете настраивать библиотеку под себя, внутри исходника есть некоторые параметры, вроде задержки между отправкой пакетов, ограничением на размер передаваемых данных, сигнатурами заголовка, данных, конца, ответов да/нет и т.д. Весь код тщательно закомментирован.
Если будут какие-то проблемы с библиотекой - пишите в комментариях.
Теперь не по теме:
В данный момент я работаю над созданием голосового чата для SAMP. (Пишу на C++)
Уже удалось передать моно звук на частоте 8 КГц практически не нагружая сервер. Битрейт передачи звука примерно 6 Кбит/с.
Поддержать автора:
YandexMoney: 410015548714485
Qiwi: +79676632360
Qiwi: +79676632360
Вложения
Последнее редактирование модератором: