The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Строки в Перл и завершающий символ"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Строки в Перл и завершающий символ"  
Сообщение от Raist (??) on 11-Янв-07, 17:35 
Столкнулся только что с такой проблемой, Программа на перл общается по сети с программой на Си. Ситуация (примерный кусок кода)
$text = "bla bla bla);
$dataSize = length($text);
syswrite($socket,$dataSize);
syswrite($socket,$text);

Что мы получаем на сторона Си, dataSize = длине строки но без завершающего нуля, поэтому обработчки этой строки, вылазит за границы и получается полная кака. Ну да ладно, может нужно делать так?
$dataSize = length($text) + 1;
Ан нет, syswrite все равно посылает данные длиной просто length($text), тоесть никакого завершающего символа и в помине нет! (можно конечно асильно заставить послыать syswrite на одни байт больше, но толку?
Собвстенно как решить эту проблему? Не описывать же все строки в перле как "bla-bla-bal\0"

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Строки в Перл и завершающий символ"  
Сообщение от BigHo on 11-Янв-07, 18:41 
>Столкнулся только что с такой проблемой, Программа на перл общается по сети
>с программой на Си. Ситуация (примерный кусок кода)
>$text = "bla bla bla);
>$dataSize = length($text);
>syswrite($socket,$dataSize);
>syswrite($socket,$text);
>
>Что мы получаем на сторона Си, dataSize = длине строки но без
>завершающего нуля, поэтому обработчки этой строки, вылазит за границы и получается
>полная кака. Ну да ладно, может нужно делать так?
>$dataSize = length($text) + 1;
>Ан нет, syswrite все равно посылает данные длиной просто length($text), тоесть никакого
>завершающего символа и в помине нет! (можно конечно асильно заставить послыать
>syswrite на одни байт больше, но толку?
>Собвстенно как решить эту проблему? Не описывать же все строки в перле
>как "bla-bla-bal\0"

Как ни странно, то такой метод не самый плохой. Наращивать строку всего на один байт - лишние накладные расходы, особена когда строка особено велика. Поэтому можно сделать функцию:
sub submit {
.   my ($sock, $s) = @_;
.   $l = len($s);
.   if ($l > $pagesize) {
.       syswrite($sock, $s, $l); # Иногда лучше сделать два системных вызова, чем копировать большой объем информации.
.       syswrite($sock, "\0");
.   } else {
.       syswrite($sock, $s . "\0");
.   }
};

Лучше конечно передавать не завершающий символ в качестве определителя конца строки, а в начале строки указывать длину передаваемого буфера. В этом случае на стороне C программы всегда надо будет увеличивать длину на 1, т.к. даже строка нулевой длины в UNIX занимает длину в 1 байт.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру