2012-02-24 4 views
1

Я пытаюсь отправить скалярное значение по сокету, которое у меня есть с nfreeze из хранилища. Шаг за шагом:Отправить пакеты данных по UDP

  1. Я получаю Скалярное $serializedHash = nfreeze \%hash;
  2. Я хочу, чтобы отправить его через гнездо $sendSocket->send($serializedHash);

Это работает отлично, до тех пор, как скалярное не больше, чем 1024byte. Поскольку у меня есть с другой стороны сокет, который может принимать только данные с макс. длина 1024 байт. Я также не могу хранить в файле, а затем обрабатывать его с помощью sysread и syswrite.

То, что я не хочу, - это отправлять каждую строку на каждый сокет, поскольку мой хэш имеет более 2 миллионов записей. Элемент хеширования разделен \n, поэтому я попробовал функцию split, но затем у меня есть массив с 2 миллионами записей.

Как я могу отправить данные в пакетах через сокет UDP?

+0

Почему UDP? На самом деле это не так. (См. Мой комментарий к отвечу raina77ow для получения дополнительной информации.) – ikegami

ответ

3

Вы, возможно, обработать сериализованную хэш кусками, как это:

while ($serializedHash =~ /(.{1,1024})/sg) { 
    my $chunk = $1; 
    # sending $chunk 
} 
+0

, пожалуйста, объясните, что это бит litle больше =) – Mijat

+0

Как я понимаю, вам нужно разделить свою большую строку на более мелкие части, а затем отправить их через UDP один за другим. Я предлагаю на самом деле довольно обычное решение: while ($ string = ~/$ pattern/g) loop. Образец $ сопоставляется по строке снова и снова, каждый раз, начиная с позиции, которую он закончил ранее. Поскольку по умолчанию он жадный, он захватывает 1024 символа - или все остальное. – raina77ow

+0

Кстати, здесь есть потенциальная ошибка: так как мы должны обрабатывать байты, а не символы, возможно, также следует использовать директиву «использование байтов». – raina77ow

Смежные вопросы