Непрерывная отправка файла через netcat/socat

Я хочу непрерывно отправлять файл с одного Raspberry Pi на другой (пока они не выключаются или что-то в этом роде). Я отправляю данные с одного Pi на точку доступа и пересылаю эти данные с этой точки доступа на другой Pi. Я использую текущий код для отправки файла один раз (успешно):

Получатель: socat TCP-LISTEN:4242 /home/pi/Desktop/smth

Отправитель: socat TCP:hostname:4242 /home/pi/Desktop/zeroMega.dat

Файл, который я отправляю (zeroMega.dat), является случайно сгенерированным файлом, так как мне не нужны данные, и мне просто нужно постоянно отправлять (зацикливать) этот файл размером 1 МБ с одного Pi на другой. Как я мог это сделать? Я знаю, что мне, вероятно, нужно создать скрипт для непрерывного запуска, тем более что мне нужно, чтобы он запускался при запуске. Любая помощь будет оценена по достоинству. Спасибо.


person Sapiens    schedule 09.05.2016    source источник
comment
Другой вариант может заключаться в том, чтобы использовать /dev/zero в качестве вашего файла, и это будет вечно добавлять нули...   -  person Mark Setchell    schedule 09.05.2016
comment
Я создал файл zeroMega.dat, используя /dev/zero в первую очередь. Спасибо.   -  person Sapiens    schedule 09.05.2016
comment
Моя точка зрения заключалась в том, что если ваш файл бесконечно велик, вам не придется повторно зацикливаться, потому что первый файл будет длиться вечно.   -  person Mark Setchell    schedule 09.05.2016
comment
Мой файл имеет размер 1 МБ, я выбрал случайное низкое значение, потому что, насколько я знаю о системах Linux, они хранят большинство вещей в оперативной памяти, а у меня 1 ГБ. Первоначально я отправлял файл размером 1,3 ГБ, и он считывался непосредственно с SD-карты (файл был слишком большим для хранения в ОЗУ), что ограничивало мою скорость передачи. Я думал, что смогу зациклить файл размером 1 МБ, чтобы иметь более высокую скорость передачи из-за того, что файл хранится в ОЗУ. Ты думаешь, это хорошая идея?   -  person Sapiens    schedule 09.05.2016
comment
Чтение с /dev/null должно обеспечивать гигабайты в секунду, а также не требует места или полосы пропускания с вашей SD-карты. Попытайся! time dd if=/dev/zero of=/dev/null bs=65536 count=10000000   -  person Mark Setchell    schedule 09.05.2016
comment
Это кажется хорошей идеей, я генерирую ее со скоростью 3,2 ГБ/с. Поправьте меня, если я ошибаюсь, я сейчас постоянно генерирую файл, полный нулей? Могу ли я переслать это по сети на другое мое устройство, если я интегрирую его в свой скрипт? Это означало бы, что мне не нужно зацикливать файл размером 1 МБ, что, вероятно, было бы лучше. Спасибо.   -  person Sapiens    schedule 09.05.2016
comment
Да, именно это я и имел в виду. Вы можете просто прочитать его и отказаться от него на другом конце. Кроме того, на Pi SD-карта разделяет пропускную способность USB с сетью, поэтому это еще больше забьет вашу сеть.   -  person Mark Setchell    schedule 09.05.2016
comment
И последний вопрос. Я генерирую файл из /dev/zero (в своем сценарии), как вы советовали, но моя точка доступа сходит с ума и не показывает трафик, как и мой анализатор спектра. Могу ли я указать размер файла (как у вас выше) в скрипте? В настоящее время я запускаю этот #!/bin/bash while true; do echo "press CTRL+C to stop" dd if=/dev/zero | socat - UDP:right_pi:4244 done. Я не знаю, являются ли параметры файла проблемой, но я пока не могу передать бесконечный файл.   -  person Sapiens    schedule 09.05.2016
comment
Да, вы можете добавить размер блока и количество блоков. Мне сложно сказать, что происходит :-)   -  person Mark Setchell    schedule 09.05.2016
comment
Извините и спасибо, я разберусь.   -  person Sapiens    schedule 09.05.2016


Ответы (1)


Поместите его в бесконечный цикл:

while true; do
  # whatever should be repeated forever
done
person Thomas    schedule 09.05.2016
comment
Спасибо, Томас, я попробовал это, и хотя логика кажется правильной, я получаю сообщение об ошибке из-за используемого порта. У меня есть вышеупомянутый код в моем посте, скопированный в примере while, который вы мне дали, в двух файлах .sh на обоих Raspberry Pi. Кажется, что когда я отправляю свой файл через указанный порт (в данном случае 4242), я получаю сообщение об ошибке: Address already in use Я полагаю, это потому, что после отправки файла один раз он пытается использовать тот же порт и видит, что существует существующий процесс там. Как я мог преодолеть это? Отправка файла через один и тот же порт бесконечное количество раз была бы идеальной. - person Sapiens; 09.05.2016
comment
Хм, да, порты продолжают оставаться зарезервированными некоторое время после их закрытия. Вы действительно хотите сохранить файл на другом конце? Если все, что вам нужно, это генерировать некоторый трафик, может быть проще вместо этого отправить бесконечный поток данных. Другие комментаторы пришли к такому же выводу :) - person Thomas; 09.05.2016
comment
Да действительно мне не нужно хранить инфу на другом конце, фактически я пишу ее /dev/null на принимающей стороне. Использование UDP вместо TCP дает мне некоторый трафик (~ 15 Мбит/с). Хоть и не стабильно (иногда полностью останавливается на 10 секунд), но опять же UDP. Спасибо. - person Sapiens; 09.05.2016