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