Столкнулся только что с такой проблемой, Программа на перл общается по сети с программой на Си. Ситуация (примерный кусок кода)
$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"
>Столкнулся только что с такой проблемой, Программа на перл общается по сети
>с программой на Си. Ситуация (примерный кусок кода)
>$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 байт.